たとえば、2つの配列を組み合わせて、次のようにwhere句を追加したいと思います。
(Recipe.current + Recipe.previous).where(:name => "ABC")
1つに結合できることは知っていますが(Recipe.where( "current is true or previous is true"))、上記の方法で配列を結合するように強制する複雑なクエリがいくつかあります。
出来ますか?
たとえば、2つの配列を組み合わせて、次のようにwhere句を追加したいと思います。
(Recipe.current + Recipe.previous).where(:name => "ABC")
1つに結合できることは知っていますが(Recipe.where( "current is true or previous is true"))、上記の方法で配列を結合するように強制する複雑なクエリがいくつかあります。
出来ますか?
答えは、情報を取得するために実行するデータベースクエリの数によって異なります。
2つのデータベースクエリを使用しても問題がない場合は、次のようにします。
rel = Recipe.where(:name => "ABC")
recipes = rel.current | rel.previous
すべてを1つのデータベースクエリにOR
まとめたい場合は、通常のActiveRecordメソッドを超えて、Arelまたはクエリ生成gemのいずれかを使用する場合を除いて、リレーションで句を使用する必要があります。
Railsで複雑な単一のSQLクエリを作成して、目標をアーカイブしたいと思いますか?プレーンSQLクエリでそれを実行できる場合、それは通常Railsで可能です。
カスタマイズされたSQLクエリ文字列を作成することは別の解決策かもしれません。
もう1つの方法は、これらの配列を組み合わせて、Rubyの「拒否」を使用することです。パターンに一致しない要素を削除するには、パフォーマンスの問題が発生する可能性があります。
モデルの.current
とは、オブジェクト.previous
を返すスコープのようです。ActiveRecord::Relation
これらのオブジェクトにはメソッド.where
を使用できますが、これらのオブジェクトを組み合わせると、配列が返されます。配列には。がありません.where
。したがって、組み合わせの前にそのクエリを渡すか、クエリの混乱を解消する必要があります。2番目を選択する場合は、Squeelの宝石を強くお勧めします。