Find_by_sql error, any ideas please


#1

Hello,

I am having problems with the find_by_sql while trying to update a
table. I am using mysql and rails 2.2.2.

A small test like this:

User.find_by_sql “update users set name=‘Test’”

generates a horrible error. I might also add that I have config.gem
“mysql” in my environment.rb and that I have tested the update query
with sqlite and it works. Any ideas?

Thanks,

Elías

You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.all_hashes
/home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/
active_record/connection_adapters/mysql_adapter.rb:564:in select' /home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/ active_record/connection_adapters/abstract/database_statements.rb:7:inselect_all_without_query_cache’
/home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/
active_record/connection_adapters/abstract/query_cache.rb:60:in
select_all' /home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/ active_record/connection_adapters/abstract/query_cache.rb:81:incache_sql’
/home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/
active_record/connection_adapters/abstract/query_cache.rb:60:in
select_all' /home/elioncho/.gem/ruby/1.8/gems/activerecord-2.2.2/lib/ active_record/base.rb:635:infind_by_sql’


#2

sounds like you should be using “execute” instead of “find_by” since you
aren’t trying to find anything.


#3

Aldo S.,

Thanks for your reply, but the why does the update query inside the
find_by_sql using sqlite works?

Kind regards,

Elías

On Jan 23, 5:53 pm, Aldo S. removed_email_address@domain.invalid


#4

Sorry typo error. Here it is again:

Aldo S.,

Thanks for your reply, but then why does the update query inside the
find_by_sql using sqlite works?

Kind regards,

Elías


#5

elioncho wrote:

User.find_by_sql “update users set name=‘Test’”

Use User.update_all [‘name = ?’, ‘Test’]
or User.update “update users set name=‘Test’”


Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com


#6

Should I use the execute method then?