1

在我的应用程序中,我有这条线

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)
4

2 回答 2

4

贾廷,

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

所以使用 ActiveRelations 或使用 find 但混合使用时要小心。如果您将两者混合使用,请确保 find 出现在最后。

于 2011-01-10T06:20:57.780 回答
0

尝试

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

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

于 2011-01-10T05:13:45.830 回答