2012-09-06 13 views
8

オブジェクト? +演算子を試すと、配列が返されます。しかし、私は関係を返すためにそれが必要です。追加2人のActiveRecord ::関係は、あなたが一緒に2つの関係を追加するにはどうすればよい

おかげで、 マイク

+0

なぜあなたはすべてのあなたが必要得るためにスコープを作ることができませんか?何か複雑なのですか、この場合はできませんか?データベースレベルで行うことができるものがあれば、それをアプリケーションレベルにしないでください。 –

答えて

7

試してみてください。

new_relation = relation.merge(another_relation) 
+0

何の関係の一つがnilであることを起こる場合は? – Matt

+0

@Mattはまだ1が – kittyminky

+0

@kittyminky nilの場合でも1がnilであれば、結果はゼロになり動作します。 – Anwar

2

はあなたではなく 'AND' 'OR' の結果を得るためにはActiveRecord ::関連オブジェクトを追加する場合(あなたが得る 'AND' と思います)を連鎖することで行動し、あなたはまだいくつかの他のコード(例えばmeta_search、)で素晴らしいプレーするのActiveRecord ::関連する結果を必要とする....

def matching_one_or_two 
    temp = Model.matching_one + Model.matching_two 
    Model.where('id in (?)',temp.map(&:id)) 
end 

確かではない、世界のGRE atestのパフォーマンスを示しますが、結果として 'OR'の結果を指すActiveRecord :: Relationオブジェクトが生成されます。

また、単にではなく、データベース・アプリケーションをより良い実行するための機会を与えるために、あなたのためにそれを生成するためのRailsのを頼むよりも、直接SQLに「OR」を置くことができます。一つの例:

Model.where( "table_name.col = '1' OR table_name.col = '2'")

ものActiveRecord ::リレーションオブジェクトを返します。

3

あなたは優れたスクリーンキャストを見ることができAREL制約

constraints_1 = Model.matching_one.arel.constraints 
constraints_2 = Model.matching_two.arel.constraints 

Model.where(constraints_1.and(constraints_2)).class => ActiveRecord::Relation 
を使用でき

またはオペレータすぎ

Model.where(constraints_1.or(constraints_2)).class => ActiveRecord::Relation 

実例

constraints_1 = User.where(id: 1..5).arel.constraints 
constraints_2 = User.where('id != 2').arel.constraints 

User.where(constraints_1.and(constraints_2)) 

と2つのActiveRecord ::リレーションを追加することができますそのことについてhttp://railscasts.com/episodes/355-hacking-with-arel

+0

かっこを修正してください。それは私の目を傷つける: - P – schmijos

関連する問題