2017-12-19 31 views
-2

私はユーザーのコレクションを返すし、2つの異なるクエリの結果を結合したい。2の応答を連結する方法where節の呼び出しは?

私は現在、これを持っているが、私は正しい結果

def get_abc() 
    users = User.where("....") 
    users << User.where("...") 
    users 
end 

これは2つの異なるクエリの結果を結合するための正しい方法です

を見ていないのですか?

first_names = User.where(:first_name => 'Tobias') # ActiveRecord::Relation 
last_names = User.where(:last_name => 'Fünke') # ActiveRecord::Relation 

は、あなたが使用マージ、使用してAND(交差点)結合したい場合:

+0

これはどの条件に基づいていますか? uniqレコードが必要ですか?それは何らかのフィルタに関連していますか?私はこれを尋ねています。これはそれぞれが異なるクエリの側面を持つためです。 – Manishh

+0

Doing 'users << User.where(" ... ")'はあなたに重複レコードを与えるかもしれません。ここで '| ='を使う方が良いでしょう。 –

+0

"私は正しい結果を見ていない" - 質問ははっきりしない。あなたは正しい結果を得ておらず、2つのクエリーを一緒に組み合わせたいと思っています。まず、正しい結果を返すようにコードを修正する必要があります。 –

答えて

2

は、その後、あなたの2つのクエリは、このようなことを前提とします

first_names.merge(last_names) 

あなたが使用して結合したい場合はOR (ActiveRecord 5+、または4.2またはどこか経由で利用可能):

first_names.or(last_names) 
0

関連性のあるものフィルタのいくつかの並べ替えにすると、このアプローチは冗長データを持つように使用すべきではありません。次に最悪のことは、ユーザーデータを取得するために複数のクエリを実行することです。これを行う代わりに、さまざまなアプローチをとることができます。クエリ文字列

condition = "first_name = :first_name " 
attributes = { first_name: 'xyz'} 
condition = " And/Or last_name = :lastname" if your_other_condition? 
attributes[:lastname] = 'abc' 
users = User.where(condition, attributes) 

で スコープの助けを借りてすることができ、他の方法(私はあなたがデータをフィルタリングしていると仮定)

users = User.where("...") 
users = users.scope1 if any condition 

それは最後にクエリを使用し、あなたが所望のデータを返します。

+1

彼は1番目のクエリの結果をフィルタリングしていません。代わりに、2番目のクエリの結果を1番目のクエリに追加します。 –