find
, where
和find_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+记录时,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