Rails .where vs .find

I've noticed that the Model.where method always returns an array even if there is only one result where as the Model.find method doesn't. Is there any reason for this? I thought Model.where was the preferred function since Rails 3.X.

Should I be using Model.find when I expect a single result and Model.where when I expect more than one result?

71071 次浏览
  • where 返回一个 ActiveRecord::Relation(不是一个数组,尽管它的行为很像数组) ,它是模型对象的 收藏品。如果没有匹配的条件,它只是返回一个空关系。

  • find (及其相关的动态 find_by_columnname方法)返回一个 single模型对象。如果没有发现任何异常,则会引发 ActiveRecord::RecordNotFound异常(但动态 find_by_方法不会引发此异常)。

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

So yes, if you only want and expect a single object, using find is easier, as otherwise you must call Model.where.first.

注意,从 Rails 4.0(请参阅有关的释放通知书)开始,就不推荐使用 find和许多动态 find_方法的旧式散列选项。

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

实际上,find_bywhere获得的 ActiveRecord::Relation中获取一个模型对象

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

来源