47

findwhere和有什么区别find_by_id?当您尝试查找给定 ID 的用户时,它们都会起作用。

4

5 回答 5

68

区别在于找到记录或未找到记录时返回的内容。考虑以下示例:

>> 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
于 2013-03-03T13:02:44.423 回答
5

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
于 2016-10-04T09:16:56.343 回答
1

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")
于 2013-03-03T13:03:37.147 回答
0

对我来说很简单......

'Find' 结果返回单个对象给您,但 'Where' 返回 Array 给您,因此您需要添加 .each 以从该数组中获取每个对象。

于 2019-01-28T10:02:33.507 回答
0

没什么大不了的,但是当您尝试检索 1+ 条记录然后您需要更新每条记录并且您想使用 时,还有另一个区别find,因为查询的结果是. 但是,如果您尝试在 find 中使用结果,则会出现错误。wherefind_eachwherewhereActiveRecord::Relationfind_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
于 2022-02-07T21:23:37.633 回答