2017-09-06 6 views
0

私はRails 5を使用しています。IDでレコードを検索するのは混乱しています。私はモデルUserを持っていますが、無IDで調べると、結果は戻ってきます...Rails 5では、find_byが存在しない場合、結果を返さないようにするにはどうすればよいですか?

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: "[email protected]", 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を返していますか?

答えて

1

あなたはfind_byに渡しているパラメータはクエリに適用する条件を定義する - find_by(*args)はちょうどwhere(*args).takeです。

あなたが示したコード、User.find_by(nil)は、そうselect * from users limit 1と同等のクエリで、その結果、User.where(nil).take、またはUser.takeに相当し、無の状態で渡すのと同じです。

あなたがゼロまたは存在しない値を渡すときにエラーが、使用を投げているIDで検索しないようにしたい場合:

User.find_by(id: id) 

エラーがIDた場合にスローされるようにするには存在しません:

User.find(id) 
+0

ありがとうございます。私はまだUser.find_by(id)はidがnilだと主張していますが、結果は混乱します。 – Dave

+0

はい、それは方法を使用する非常に非正統な方法です。このメソッドは、通常はハッシュ形式の条件を指定する必要があります(ただし、SQLフラグメントを使用できます)。 –

0

それを行うための1つの方法は、BEGINとRESCUE利用するだろう。

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

ワンライナー:

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

ありがとうございますが、私は1行の解決策を探していました。そのIDでレコードを検索することはそれほど難しいことではありません。 – Dave

0

は、ここで1行のソリューションです:

User.where(id: id).first 

これは、(場合通常である)あなたのid列がNULL可能でないを前提としています。あなたが行うことができない場合は、次の

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

私のIDはヌル可能ではありません。私の質問に記載されている声明がなぜ失敗するのですか? – Dave

+0

'user.where(id:id).first'は意味的に' find_by'と全く同じではありません。 'first_'は' find_by'には存在しないクエリに 'order by id'を適用します。 idが一意である単一のidを見つけるために、結果は等価ですが、もちろん他の型の列には当てはまりません。 –

関連する問題