find
和where
和有什么区别find_by_id
?当您尝试查找给定 ID 的用户时,它们都会起作用。
5 回答
区别在于找到记录或未找到记录时返回的内容。考虑以下示例:
>> User.create name: 'THE USER' # creates a user with id = 1
>> User.find(1) # returns the user
>> User.find_by_id(1) # returns the user
>> User.where(id: 1).first # returns the user
如您所见,可以使用 3 种方法中的任何一种来获取现有用户。using 的最大区别where
是您可以链接命令(当然,无需first
先调用。)
让我们看看您何时尝试查找不存在的记录
>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
所以在这里,很明显,当您使用find
搜索不存在的记录时,您会遇到异常。该例外是ActiveRecord::RecordNotFound
在生产环境中呈现 404。
希望这可以帮助!
更新
Rails 4 使用以下语法find_by
>> User.find_by(id: 1) # returns nil if there's no user with an id of 1
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found
find => 如果系统中存在给定的primary_key(id),则返回单个记录,否则会出错。
Model.find(required_id_value)
find_by => 这将返回取决于给定属性的单个记录,如果数据库中不存在该属性的值,它将返回 nil。
Model.find_by_name("your name")
这里的 name 是属性,它必须存在于您的 Modal 中。
where => 这将返回一个包含零个或多个记录的活动记录关系,您首先需要使用它来仅返回一条记录,或者在零记录返回的情况下返回 nil。
Model.where(id: id_value).first
find
=> 这用于查找行id
。这将返回单个记录。
YourModel.find(2)
Address.find(1)
find_by
=> 这用于通过记录的任何属性获取行。如果条件匹配,这将返回第一个匹配记录。
YourModel.find_by_attrname("value")
Address.find_by_street_name_and_city("Andheri", "Newyork")
Addess.find_by_id(4)
where
=> 这用于根据条件获取活动记录以返回活动记录关系(即)可能是零个或多个记录。
YourModel.where(:attrname => "something")
Address.where(:city => "Newyork")
对我来说很简单......
'Find' 结果返回单个对象给您,但 'Where' 返回 Array 给您,因此您需要添加 .each 以从该数组中获取每个对象。
没什么大不了的,但是当您尝试检索 1+ 条记录然后您需要更新每条记录并且您想使用 时,还有另一个区别find
,因为查询的结果是. 但是,如果您尝试在 find 中使用结果,则会出现错误。where
find_each
where
where
ActiveRecord::Relation
find_each
Profile.find([1, 2, 3]).find_each { |e| puts e.id }
=> NoMethodError (undefined method `find_each' for
<Array:0x0000555e923d3f38>)
Profile.where(id: [1, 2, 3]).find_each { |e| puts e.id }
=> 1
=> 2
=> 3