Rails .where vs .find

Ada*_*amB 74 ruby-on-rails ruby-on-rails-3

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

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

And*_*all 117

  • 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_方法(请参阅相关的发行说明).

  • @klump是的,它可以,但是`User.where(id:[1,2,3])`在那种情况下是首选,所以我甚至没有考虑它.一如既往,我建议您阅读API文档(我在回答中已链接到),因为它提供了最详细的信息. (3认同)

Kam*_*nek 13

实际上find_bywhere获得的模型对象ActiveRecord::Relation

def find_by(*args)
  where(*args).take
end
Run Code Online (Sandbox Code Playgroud)

资源

  • 请注意,直到Rails 4(原始问题被标记为rails 3)才添加find_by. (4认同)

ilt*_*mpo 6

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

  • 如果你做`.find(:conditions => {:col_name => some_vals})` (7认同)