find,where和find_by_id有什么区别?

时间:2013-03-03 12:59:56

标签: ruby-on-rails ruby-on-rails-3

findwherefind_by_id之间的区别是什么?当您尝试查找具有ID的用户时,它们都会起作用。

4 个答案:

答案 0 :(得分:61)

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

>> 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

答案 1 :(得分:3)

查找 =&gt;如果给定的primary_key(id)存在于系统中,则返回单个记录,否则将产生错误。

0

find_by =&gt;这将返回单个记录取决于给定的属性,如果该属性的值不存在于DB中,它将返回nil。

Model.find(required_id_value)

此处的名称是属性,它必须存在于您的模态中。

其中 =&gt;这将返回一个活动的记录关系,你需要首先使用零个或多个记录来返回一个记录,如果零记录返回则返回nil。

Model.find_by_name("your name")

答案 2 :(得分:1)

find =&gt;这用于按id查找行。这将返回单个记录。

YourModel.find(2)
Address.find(1)

find_by =&gt;这用于通过记录的任何属性获取行。如果条件匹配,这将返回第一个匹配记录。

YourModel.find_by_attrname("value")
Address.find_by_street_name_and_city("Andheri", "Newyork")
Addess.find_by_id(4)

where =&gt;这用于获取基于条件的活动记录以返回活动记录关系(即)可以是零个或多个记录。

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

答案 3 :(得分:0)

对我来说很简单。...

“查找”结果将单个对象返回给您,但“位置”将返回数组给您,因此您需要添加.each从该数组中获取每个对象。