NoMethodError

Hi there! Im new on ruby/rails, and im tying to run the rake task below but I got an error. After I tested on script/console and I got the same error. Could you helpe me, please?

Thanks! Pedro

Rake Task:

namespace :meuApp do    desc 'Update geotable with longitude and latitude information'    task :add_geotable_coordinates => :environment do    include GeoKit::Geocoders        geotable = Geotable.find_by_sql(["SELECT * FROM geotable WHERE ADDRESS IS NOT NULL"])            begin               geotable.each { |geotable|                    loc = MultiGeocoder.geocode(geotable.address)                    geotable.lat = loc.lat                    geotable.lng = loc.lng                    geotable.update                    puts "updated cartcid #{geotable.NOME} #{geotable.address} =>                    [#{loc.lat}, #{loc.lng}]"                }                rescue                puts $!             end     end end

The script/console test:

Geotable.find_by_sql(["SELECT * FROM geotable WHERE ADDRESS IS NOT

NULL"]) .... .... data retrieved ommited ......

@geotable.address

NoMethodError: undefined method `address' for #<Array:0x4712fa0>        from (irb):27

You're re-using your geotable variable inappropriately... try:

geotables = Geotable.find_by_sql(["SELECT * FROM geotable WHERE ADDRESS IS NOT NULL"]) begin   geotables.each { |geotable|     loc = MultiGeocoder.geocode(geotable.address)     blah blah blah

the collection and the object are named the same?

Hi radhames,

Yes, the names were the same. Now I changed the names for table, collection, etc. Now, Im getting different error: undefined method `address' for #<Array:0x4453c68>

++------------------------------------- new code----------------------------------++ namespace :Geo do     desc 'Update cartcid with longitude and latitude information'     task :add_cartcid_coordinates => :environment do     include GeoKit::Geocoders         c = Cartcid.find_by_sql(["SELECT address FROM cartcid WHERE ADDRESS IS NOT NULL"])             begin                 c.each { |cartcid|                     loc = MultiGeocoder.geocode(c.address)                     c.lat = loc.lat                     c.lng = loc.lng                     c.update                     puts "updated cartcid #{c.nome} #{c.address} =>                     [#{loc.lat}, #{loc.lng}]"                 }                 rescue                 puts $!              end      end end

Sometimes this happens when the class can ot be instanciated, see if you have a typo in the model somewhere

namespace :Geo do     desc 'Update cartcid with longitude and latitude information'     task :add_cartcid_coordinates => :environment do     include GeoKit::Geocoders         c = Cartcid.find_by_sql(["SELECT address FROM cartcid WHERE ADDRESS IS NOT NULL"])             begin                 c.each { |cartcid|                     loc = MultiGeocoder.geocode(c.address)                     c.lat = loc.lat                     c.lng = loc.lng                     c.update                     puts "updated cartcid #{c.nome} #{c.address} =>                     [#{loc.lat}, #{loc.lng}]"                 }                 rescue                 puts $!              end      end end

Still wrong... you did the exact same thing as before in another way...

        c = Cartcid.find_by_sql(["SELECT address FROM cartcid WHERE

Given your code, "c" is an array (of Cardcid's) - and the Array class does not have an address attribute.

                c.each { |cartcid|

Given this line, you are processing each individual element in "c" in a variable named "cartcid"

                    loc = MultiGeocoder.geocode(c.address)

Now you are referencing the array "c" again!!! Just like you were doing in your earlier post. That line needs to be:

loc = MultiGeocoder.geocode(cartcid.address)

Ok, now I got it, the code is below, but now I have the follow error:

Attempt to call private method

I dont know if it is related with this error, but this table is a legacy and I had to set table name and primary key.

The model is : class Cartcid < ActiveRecord::Base    set_table_name "cartcid"    set_primary_key "NUMERO" end

namespace :GeoFind do     desc 'Update cartcid with longitude and latitude information'     task :add_cartcid_coordinates => :environment do     include GeoKit::Geocoders         c = Cartcid.find_by_sql(["SELECT address, lat, lng FROM cartcid WHERE ADDRESS IS NOT NULL"])             begin                 c.each { |cartcid|                     loc = MultiGeocoder.geocode(cartcid.address)                     cartcid.lat = loc.lat                     cartcid.lng = loc.lng                     cartcid.update                     puts "updated cartcid #{cartcid.nome} #{cartcid.address} =>                     [#{loc.lat}, #{loc.lng}]"                 }                 rescue                 puts $!              end      end end

Ok, now I got it, the code is below, but now I have the follow error:

Attempt to call private method

I dont know if it is related with this error, but this table is a legacy and I had to set table name and primary key.

update is a private method - you should be calling save (or save!)

Fred

Attempt to call private method

Where you got told about that error, you would've been told the line number... passing on that information would help in most cases (and would tell you *exactly* where the problem is)

               cartcid\.update

"update" is a private method - you probably just want to .save

It is running, but not saving, is there a commit like command?

No. The problem is that because you've only selected the address column rails can't save the object, because it doesn't know its id.

Fred

So, what I have to do? Use c =Cartcid.find(:all) instead?

So, what I have to do? Use c =Cartcid.find(:all) instead?

Firstly, please quote what you're replying to, because your last two posts make no sense out of context.

Fred post::::

It is running, but not saving, is there a commit like command?

No. The problem is that because you've only selected the address column rails can't save the object, because it doesn't know its id. Fred

Michael Pavlin post :

So, what I have to do? Use c =Cartcid.find(:all) instead?

Firstly, please quote what you're replying to, because your last two posts make no sense out of context.

No. The problem is that because you've only selected the address column rails can't save the object, because it doesn't know its id.

Secondly, what did you try in response to Fred pointing out you'd only selected the address? You could use .find(:all) (or .all) or you could "SELECT * ..." in your find_by_sql.

Im using find_by_sql(["SELECT address, lat, lng FROM cartcid WHERE ADDRESS IS NOT NULL"]) because the table have 60.000 rows, with blob field. This choice was made thinking in performance issues. So "select" would improve performance. Now I include the primary key on select and it works.

Thanks to all of you,

Pedro