Model 在Rails 5中,如果不存在结果,如何防止find_返回结果?

Model 在Rails 5中,如果不存在结果,如何防止find_返回结果?,model,rails-activerecord,ruby-on-rails-5,Model,Rails Activerecord,Ruby On Rails 5,我正在使用Rails 5。我对按ID查找记录感到困惑。我有一个模型,用户,但当我用nil ID查找时,我会得到一个结果 2.4.0 :002 > User.find_by(nil) User Load (0.5ms) SELECT "users".* FROM "users" LIMIT $1 [["LIMIT", 1]] => #<User id: 2, provider: "google_oauth2", uid: "1015235490290283928346

我正在使用Rails 5。我对按ID查找记录感到困惑。我有一个模型,用户,但当我用nil ID查找时,我会得到一个结果

2.4.0 :002 > User.find_by(nil)
  User Load (0.5ms)  SELECT  "users".* FROM "users" LIMIT $1  [["LIMIT", 1]]
 => #<User id: 2, provider: "google_oauth2", uid: "10152354902902839283465", email: "user@hotmail.com", first_name: "Dave", last_name: "LastName", oauth_token: nil, oauth_expires: nil, created_at: "2017-08-28 19:49:18", updated_at: "2017-09-04 20:03:36", last_login: nil, currency_id: nil, email_confirmed: false, confirm_email_key: nil, confirm_key_expires: nil>

如何通过ID查找活动记录,但如果没有ID与给定参数匹配,则返回nil?

一种方法是使用BEGIN和RESCUE

begin
  User.find(id)
rescue ActiveRecord::RecordNotFound
  p "Display error here"
end
一艘班轮:

User.where(id: 'id').present? ? User.find('id') : nil

以下是一个单线解决方案:

User.where(id: id).first
这假定您的id列通常不可为空。如果没有,您可以:

User.where(id: id).where.not(id: nil).first

传递给find_by的参数定义了要应用于查询的条件-find_by*args正好是*args.take的位置

显示的代码User.find_bynil与无条件传递相同,因此相当于User.wherenil.take或User.take,从而生成一个相当于select*from users limit 1的查询

如果要按id搜索,并且在传递nil或不存在的值时不会引发错误,请使用:

User.find_by(id: id)
如果要在id不存在时引发错误,请使用:

User.find(id)

谢谢,但我正在寻找一种单线解决方案。按id查找记录不会那么困难。不,我的id不能为空。为什么我在问题中列出的语句失败了?User.whereid:id.first在语义上与使用find_by不完全相同,因为前者将order by id应用于find_by不存在的查询。对于查找id唯一的单个id,结果当然是等效的,但对于其他类型的列可能不是。谢谢。我仍然认为User.find_byid,其中id为nil,但返回的结果令人困惑。是的,但这是一种非常非正统的方法。该方法希望提供一个条件,通常以散列的形式提供,尽管可以使用SQL片段。