尝试在Rails 3中使用新的Active Record Query Interface时出错

时间:2010-11-18 10:21:10

标签: ruby-on-rails activerecord ruby-on-rails-3

我正在尝试将new Active Record Query Interface用于Rails 3.

我的旧样式查询是

my_notes = Note.find(:all, :conditions => { :user_id => current_user.id, :date => p[:date] }, :order => "date ASC, created_at ASC")

在新风格中,我认为它会是:

my_notes = Note.find_all_by_user_id_and_date(current_user.id, p[:date]).order('date ASC, created_at ASC')

但是我收到了这个错误:

NoMethodError in NotesController#play
undefined method `order' for #<Array:0x00000103d23c38>

我做错了什么?谢谢你的阅读。

2 个答案:

答案 0 :(得分:6)

find_all_by_<attritubte>不是新ARel语法的一部分。它立即执行查询并返回带有结果的数组。由于查询已经执行,因此您无法再添加order等选项。

请改为尝试:

Note.find.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC')

答案 1 :(得分:4)

新的查询接口工作方式稍有不同 - find_all_by_user_id_and_date将返回一个结果数组,而order返回一个ActiveRecord :: Relation对象,然后可以进一步限定范围。

工作查询将是

my_notes = Note.order('date ASC, created_at ASC').find_all_by_user_id_and_date(current_user.id, p[:date])

但通常最好为查询使用AREL语法:

my_notes = Note.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC').all