区别在于它们在找到记录或未找到记录时返回的内容.考虑下面的例子:
>> 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
如您所见,可以使用这三种方法中的任何一种获取现有用户.使用where
的最大区别在于,您可以链接命令(当然,无需先调用first
)
让我们看看当你试图找到一个不存在的记录时
>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
所以在这里,很明显,当你用find
搜索一条不存在的记录时,你会得到一个异常.这个例外是ActiveRecord::RecordNotFound
,它在生产环境中呈现404.
希望这有帮助!
UPDATE
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