Rails .where vs .find

时间:2012-03-05 21:57:31

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

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

当我期望单个结果时,我应该使用Model.find吗?当我预期会有多个结果时,我应该使用Model.where吗?

3 个答案:

答案 0 :(得分:115)

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

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

    虽然find可以返回一个记录数组 - 而不是一个关系 - 如果给出一个ID列表,那么从Rails 3开始首选使用wherefind的许多类似用法现在都是deprecated or gone entirely

所以是的,如果您只想要并期望单个对象,则使用find会更容易,否则您必须致电Model.where.first

请注意,自Rails 4.0(see relevant release notes)起,不推荐使用find和许多动态find_方法的旧式哈希选项。

答案 1 :(得分:12)

实际上find_bywhere获取了ActiveRecord::Relation

的模型对象
def find_by(*args)
  where(*args).take
end

Source

答案 2 :(得分:6)

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