轨道上的红宝石 - 查找、位置和find_by_id有什么区别?



find, wherefind_by_id有什么区别?当您尝试查找给定ID的用户时,它们都有效。

不同之处在于它们在找到记录或未找到记录时返回的内容。考虑下面的例子:

>> 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种方法中的任何一种来获取一个现有的用户。使用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 =>这将返回单个记录取决于给定的属性,如果属性的值在DB中不存在,它将返回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 =>这是用来根据获取活动记录的条件返回活动记录的关系(即可以是0条或多条记录)。

YourModel.where(:attrname => "something")
Address.where(:city => "Newyork")

Simple to me....

'Find'返回单个对象作为结果,但'Where'返回Array给你,所以你需要添加。each来从该数组中获取每个对象。

没什么大不了的,但是当你试图检索1+记录时,findwhere之间还有另一个区别,然后你需要更新每条记录,你想使用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

最新更新