Rails .where与.find


76

我注意到即使该Model.where方法没有返回一个结果,该Model.find方法也总是返回一个数组。有什么理由吗?我认为这Model.where是自Rails 3.X以来的首选功能。

Model.find当我期望一个结果并且Model.where期望多个结果时,我应该使用吗?

Answers:


120
  • where返回一个ActiveRecord::Relation(不是数组,即使其行为很像数组),它是模型对象的集合。如果没有任何条件符合条件,则仅返回一个空关系。

  • find(及其相关的动态find_by_columnname方法)返回单个模型对象。如果未找到任何内容,ActiveRecord::RecordNotFound则会引发异常(但动态find_by_方法则不会)。

    find如果可以给定ID列表,虽然可以返回一个记录数组(而不是一个关系),但是where从Rails 3开始,首选使用。find现在,许多类似的用法已被弃用或完全消失

因此,是的,如果只希望并期望有一个对象,则使用起来find会更容易,否则必须调用Model.where.first

请注意,从Rails 4.0开始,不建议使用旧的哈希选项find和许多动态find_方法(请参阅相关的发行说明)。


我认为find可以返回数组中的多个对象-试试User.find [1,2,3](查找ID为1、2和3的用户)...但是,是的,我想安德鲁(
Andrew)

3
@klump是的,可以,但是User.where(id: [1, 2, 3])在那种情况下是首选,所以我什至没有考虑。与往常一样,我建议您阅读API文档(我在答案中已链接到该文档),因为它提供了最详细的信息。
安德鲁·马歇尔

但是.find(:all, ...)返回一个数组。那么find和位置之间有什么区别?
highBandWidth 2012年

@highBandWidth参见上面的评论。我也更新了答案。where不返回数组(即使Model.where(...).class会说谎并说是)。
安德鲁·马歇尔


6

Model.find正在使用主键列。因此,总有一个结果或没有结果。当您正在寻找由其ID标识的特定元素时,请使用它。


7
如果你不这样做的话.find(:conditions => {:col_name => some_vals})
highBandWidth 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.