我注意到即使该Model.where
方法没有返回一个结果,该Model.find
方法也总是返回一个数组。有什么理由吗?我认为这Model.where
是自Rails 3.X以来的首选功能。
Model.find
当我期望一个结果并且Model.where
期望多个结果时,我应该使用吗?
Answers:
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_
方法(请参阅相关的发行说明)。
User.where(id: [1, 2, 3])
在那种情况下是首选,所以我什至没有考虑。与往常一样,我建议您阅读API文档(我在答案中已链接到该文档),因为它提供了最详细的信息。
.find(:all, ...)
返回一个数组。那么find和位置之间有什么区别?
where
不返回数组(即使Model.where(...).class
会说谎并说是)。
Model.find
正在使用主键列。因此,总有一个结果或没有结果。当您正在寻找由其ID标识的特定元素时,请使用它。
.find(:conditions => {:col_name => some_vals})
。
find
可以返回数组中的多个对象-试试User.find [1,2,3]
(查找ID为1、2和3的用户)...但是,是的,我想安德鲁(