我注意到Model.where
方法总是返回一个数组,即使只有一个结果,而Model.find
方法却没有。这有什么理由吗?我认为Model.where
是Rails 3.X以来的首选功能。
当我期望单个结果时,我应该使用Model.find
吗?当我预期会有多个结果时,我应该使用Model.where
吗?
答案 0 :(得分:115)
where
返回一个ActiveRecord::Relation
(不是一个数组,即使它的行为很像一个),它是模型对象的集合。如果没有任何条件匹配,它只会返回一个空关系。
find
(及其相关的动态find_by_columnname
方法)返回单个模型对象。如果未找到任何内容,则会引发ActiveRecord::RecordNotFound
异常(但不会使用动态find_by_
方法)。
虽然find
可以返回一个记录数组 - 而不是一个关系 - 如果给出一个ID列表,那么从Rails 3开始首选使用where
。find
的许多类似用法现在都是deprecated or gone entirely
所以是的,如果您只想要并期望单个对象,则使用find
会更容易,否则您必须致电Model.where.first
。
请注意,自Rails 4.0(see relevant release notes)起,不推荐使用find
和许多动态find_
方法的旧式哈希选项。
答案 1 :(得分:12)
答案 2 :(得分:6)
Model.find
正在使用主键列。因此总会有一个或没有结果。当您查找由其ID标识的特定元素时,请使用它。