0

私は、その "最後にNOT IN"をチェーンしようとしているMySQLクエリを持っています。ここでアクティブレコードの "NOT IN"

は、それがアクティブレコードを使用してRubyで次のようになります。

not_in = find_by_sql("SELECT parent_dimension_id FROM relations WHERE relation_type_id = 6;").map(&:parent_dimension_id) 

     joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id') 
      .where(relation_type_id: model_relation_id, 
       parent_dimension_id: sub_type_ids, 
       child_dimension_id: model_type) 
      .where.not(parent_dimension_id: not_in) 

だから、私がやろうとしているSQLクエリは次のようになります。

INNER JOIN dimensions ON child_dimension_id = dimensions.id 
WHERE relations.relation_type_id = 5 
AND relations.parent_dimension_id 
NOT IN(SELECT parent_dimension_id FROM relations WHERE relation_type_id = 6); 

誰かが私に何を確認することができます私はそのクエリに使用する必要がありますか? どこにチェーンしますか?

答えて

0

where句に値または値の配列を指定できます。この場合、句はin (?)句に変換されます。

このように、クエリの最後の部分は、マッピングが含まれている可能性があり:

.where.not(parent_dimension_id:Relation.where(relation_type_id:6).map(&:parent_dimension_id)) 

それとも、声明にあなたならば、基本的にまったく同じこと

+0

where.not(parent_dimension_id:Relation.where(...)。select(:parent_dimension_id)) 'ARはサブクエリ(parent_dimension_idから選択しないでください。中間のRuby配列を持つ2つのクエリ。 –

+0

私はこれをテストしていませんが、明らかに正しいです。これを答えにして、私は落ちるでしょう:) –

3

ある

.where('parent_dimension_id not in (?)', Relation.where(relation_type_id:6).map(&:parent_dimension_id)) 

を準備することができます本当に欲しいですか

SELECT parent_dimension_id 
FROM relations 
WHERE relation_type_id = 6 
サブクエリとして

、あなただけのActiveRecordの関係にそのSQLを変換する必要があります。

Relation.select(:parent_dimension_id).where(:relation_type_id => 6) 

は、where呼び出しの値として使用すると、配列を使用したいと同じようにすることをを使用します。

not_parents = Relation.select(:parent_dimension_id).where(:relation_type_id => 6) 

Relation.joins('...') 
     .where(relation_type_id: model_relation_id, ...) 
     .where.not(parent_dimension_id: not_parents) 

あなたがwhereに値としてActiveRecordの関係を使用し、その関係は、単一の列を選択:

r = M1.select(:one_column).where(...) 
M2.where(:column => r) 

ActiveRecordのがスマートです2つのクエリを実行するのではなく、in (select one_column ...)としてrのSQLをインライン化するには十分です。

あなたはおそらくあなたを置き換えることができます:

joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id') 

joins(:some_relation)単純にあなたの関係はあまりにも設定されている場合。

関連する問題