On Tuesday, 25 November 2014 03:58:01 UTC-5, Maneesh M P wrote:
>
>
> Hello,
>   
>   I am trying to fetch instances details from amazon and trying to store 
> in local mysql db. I am able to fetch all the details from amazon, but 
> while storing the data in mysql i am getting the error undefined method 
> `stringify_keys'  at two places [which ever gets executed first]
>   
>   Below is my code, can anyone please help me to resolve this error?  [ I 
> marked error in red]
>
> class Ec < ActiveRecord::Base
>    attr_accessible :instance_id, :name, :public_ip_address, 
> :availability_zone, :state, :created_at, :flavor_id, :account
>    def sync
>          properties = Array.new
>          instance = Ec.new
>          connection_dev = Fog::Compute.new({
>            :provider                 => 'AWS',
>            :aws_access_key_id        => '#######',
>            :aws_secret_access_key    => ######'
>        })
>
>        dev_instances_list = connection_dev.servers.all
>        
>        dev_instances_list.each do | inst|
>         begin
>           instance[:instance_id] =  inst.id
>           instance[:name] =   (inst.tags['Name'].to_s.empty?)? "NA" : 
> inst.tags['Name']
>           instance[:public_ip_address] =  inst.public_ip_address
>           instance[:availability_zone] =  inst.availability_zone
>           instance[:state] =  inst.state
>           instance[:created_at] =  inst.created_at
>           instance[:flavor_id] =  inst.flavor_id
>           instance[:account] =  "abc"
>           #instance.save
>           properties.push(instance)
>         rescue
>             puts "exception"
>         end
>        end
>       update_instance_details(properties)
>    end
>
>    def update_instance_details(properties)
>        updated_list = Array.new
>        to_store = Hash.new
>        up = Ec.new
>        Ec.find_each do |existing|
>           to_store = properties.select{|a| a[:instance_id] == 
> existing.instance_id}
>

`properties` here is an Array. `select` is always going to return an Array, 
even if one or no elements match.

          if(to_store.nil?)
>

So this will never work - if the instance is entirely missing, `to_store` 
will be `[]`.
 

>             #someone has deleted this instance from amazon
>             puts "Removing the record"
>             existing.delete
>           else
>           #update existing record from amazon if there any changes
> *            Ec.update(existing.id <http://existing.id>, to_store)         
>          //Errror line*
>

And then `update` is expecting a hash, not an Array - giving the error 
you've noted.

You may want `find` instead of `select` when extracting an instance's 
details from `properties`. This will return the *element* instead of an 
Array.

Example:

a = [1,2,3,4]
a.select { |el| el == 3 } # => returns [3]
a.find { |el| el == 3 } # => returns 3

For both cases, I'd recommend investigating exactly what class the values 
in `dev_instances_list` are. 

--Matt Jones

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/8dca5134-48c1-4846-8d3d-6935721a64a6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to