在我的应用中,我有一行
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)
答案 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