find,where和find_by_id有什么区别?

43 ruby-on-rails ruby-on-rails-3

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

jvn*_*ill 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
Run Code Online (Sandbox Code Playgroud)

如您所见,可以使用3种方法中的任何一种来获取现有用户.使用的最大区别where是你可以链接命令(当然,不first先调用.)

让我们来看看你何时尝试找到一个不存在的记录

>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
Run Code Online (Sandbox Code Playgroud)

所以在这里,很明显当你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
Run Code Online (Sandbox Code Playgroud)

  • 你应该注意到所有`find_by_*`方法都在rails 4中被弃用,而不是`find_by(*:...)`所以这里将是:`find_by(id:...)` (19认同)
  • 哇我不知道.谢谢!为什么不是这里提到的?http://edgeguides.rubyonrails.org/4_0_release_notes.html (3认同)
  • @pjam 除了 find_by_... 和 find_by_... 之外的所有动态方法!已弃用。https://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations (3认同)

Ala*_*ust 5

find => 如果系统中存在给定的primary_key(id),则返回单个记录,否则将给出错误。

Model.find(required_id_value)
Run Code Online (Sandbox Code Playgroud)

find_by => 这将返回取决于给定属性的单个记录,如果该属性的值在数据库中不存在,它将返回 nil。

Model.find_by_name("your name")
Run Code Online (Sandbox Code Playgroud)

这里的 name 是属性,它必须存在于您的 Modal 中。

其中=> 这将返回一个活动记录关系,其中包含零个或多个记录,您需要首先使用它来仅返回一个记录,或者在返回零记录的情况下返回 nil。

Model.where(id: id_value).first
Run Code Online (Sandbox Code Playgroud)