Rails .where和.find

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

当我期望单个结果和Model.where时我应该使用Model.find ,当我期望多于一个结果?

  • where返回一个ActiveRecord::Relation (不是一个数组,尽pipe它的行为非常像一个),这是一个模型对象的集合 。 如果没有匹配的条件,它只是返回一个空的关系。

  • find (及其相关的dynamicfind_by_columnname方法)返回单个模型对象。 如果没有find,则会引发ActiveRecord::RecordNotFoundexception(但不会使用dynamicfind_by_方法)。

    虽然find可以返回一个数组的logging,而不是一个关系,如果给定一个ID列表,使用where是首选,因为Rails 3.许多类似的使用find现在已被弃用或完全消失 。

所以是的,如果你只想要和期望一个单一的对象,使用find更容易,否则你必须调用Model.where.first

请注意,从Rails 4.0开始不推荐使用旧式哈希选项和许多dynamicfind_方法( 请参阅相关发行说明 )。

实际上, find_by从获得的ActiveRecord::Relation获取模型对象

 def find_by(*args) where(*args).take end 

资源

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