33

提供された電子メールまたは姓と名のいずれかを持つすべてのユーザーを取得したいと考えています。たとえば、次のようになります。

users = User.where(:first_name => "James", :last_name => "Scott")

「James」と「Scott」の姓名を持つすべてのユーザーが返されます。

users = User.where(:email => "james@gmail.com")

「james@gmail.com」としてメールでユーザーを返します。

where同じ姓名を持つユーザーと、1 つのクエリで一致する電子メールを持つユーザーのいずれかを返す句を実行する方法はありますか、それとも 2 つの別々の句whereでマージを行う必要がありますか。where

4

5 に答える 5

62

Rails 5 にはorメソッドが付属しています。

このメソッドはオブジェクトを受け入れActiveRecord::Relationます。例えば:

User.where(first_name: 'James', last_name: 'Scott')
    .or(User.where(email: 'james@gmail.com'))
于 2016-05-09T13:31:02.737 に答える
16

これを試して:

users = User.where("(first_name = 'James' and last_name = 'Scott') or email = 'james@gmail.com'")

変数を補間するには:

users = User.where("(first_name = ? and last_name = ?) or email = ?", first_name, last_name, email)
于 2012-06-03T14:32:11.307 に答える
9

DSL アプローチ (SQL なし) を好む場合は、基礎となる Arel レイヤーを使用できます。

t = User.arel_table
users = User.where(
  (t[:first_name].eq('Ernie').and(t[:last_name].eq('Scott')).
    or(t[:email].eq('james#gmail.com'))
)

これは少し見にくいですが、Arel のラッパー (たとえば、この) を使用すると、コードははるかに優れたものになります。

users = User.where(
  ((User[:first_name] == 'Ernie') & (User[:last_name] == 'Scott')) |
   (User[:email] == 'james#gmail.com')
)
于 2012-06-03T14:42:33.633 に答える
5

他の人が述べたようにSQLを書きたくない場合は、arel構造に直接アクセスするか(別の回答にあるように見えます)、squeel gemを使用してよりエレガントに行うことができます:

User.where{(first_name == 'Ernie') & (last_name == 'Scott') | (email == 'james#gmail.com')}
于 2012-06-03T14:37:30.243 に答える
1

のように文字列条件Client.where("orders_count = ? AND locked = ?", params[:orders], false)を使用ORし、 と組み合わせて使用​​できますAND。ただし、これらの演算子の優先度には注意してください。

Active Record Query Interface ガイドを参照

于 2012-06-03T14:30:53.793 に答える