在Rails3中选择奇怪的东西

时间:2011-01-10 04:59:47

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

在我的应用中,我有一行

Feature.all(:select=>"name", :conditions=> ['id IN (?)', feature_id_array]).map(&:name)

它工作正常。
当我将其重写为Rails3语法时,

Feature.find(feature_id_array).select('name').map(&:name)

它引发了我一个错误,说

ArgumentError in AuthoringController#edit

   wrong number of arguments(1 for 0)

app/models/widgets/widget_feature.rb:82:in `select'

所以,我在控制台上做了一些随机查询,发现:

Model.find(id_array).select(attribute)

返回相同的错误,而

Model.select(attribute).find(id_array)

工作正常。

有人可以告诉我这个的原因。我一直在挠头,但没有得到正确的理由:

Model.select(attribute)将首先获取所有记录并选择它们的名称,然后它将在id_array中找到匹配id的记录。

如果我只需要10条记录的名称,那么上述查询将首先从表中检索所有记录的名称,然后获取所需的10个名称。


编辑: 注意:以下查询工作正常:

Model.where(:id => id_array).select(attribute)

2 个答案:

答案 0 :(得分:4)

Jatin,

方法“find”不返回像where或select那样的ActiveRelation。因为它返回一个ActiveRecord :: Base对象或一个数组,所以你无法在其上添加ActiveRelation子句。您的替代方法之所以有效,是因为“where”在早期关系中也返回ActiveRelation(Model.where()),可以在ActiveRelation上调用find(Model.select()。find() - works)。

因此使用ActiveRelations或使用find,但在混合使用时要小心。如果两者混合使用,请确保最后找到。

答案 1 :(得分:0)

尝试

Feature.find(feature_id_array, :select => :name).map(&:name)

这有助于解释查询与Rails2的不同之处:http://m.onkey.org/active-record-query-interface