sql >> データベース >  >> RDS >> PostgreSQL

ActiveRecord:すべての子が条件に一致する親を見つける方法は?

    arelの使用 かなり遠くまで行くことができます。トリッキーな部分は、arelを使用してクエリ全体を記述しない方法です。 独自のクエリ構文?

    秘訣は次のとおりです。whereを使用してクエリを作成する場合 、arelを使用する場合 条件、あなたは無料でいくつかの追加のメソッドを取得します。たとえば、そこにあるサブクエリを.exists.notで調整できます。 、(NOT ( EXISTS (subquery)))を取得します それを親のwhereに投げ込みます -節とあなたは準備ができています。

    問題は、関係するテーブルをどのように参照するかということです。そのためにはアレルが必要です。あなたはできた Arelのwhereを使用します a.eq bのような醜い条件で 。しかし、なぜ?等式条件なので、代わりにRailsの条件を使用できます。取得しているテーブルをハッシュキーで参照できますが、他のテーブル(外部クエリ内)には、そのarel_tableを使用できます。 。これを見る:

    parents = Parent.arel_table
    Parent.where(
      Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
    )
    

    文字列に少し頼り、Railsのwhereへのパラメーターとしてサブクエリをフィードできるという事実に依存することで、Arelの使用量を減らすこともできます。 。あまり使用されませんが、Arelのメソッドを深く掘り下げる必要はないので、そのトリックまたはサブクエリを受け取る他のSQL演算子を使用できます(他に何かありますか?):

    parents = Parent.arel_table
    Parent.where('NOT EXISTS (?)',
      Child.where(parent_id: parents[:id], other_parent_id: nil)
    )
    

    ここでの2つの主なポイントは次のとおりです。

    • Arelで外部クエリのテーブルを参照して、通常のクエリを作成するのと同じ方法でサブクエリを作成できます。それは実際のテーブルではないかもしれません、それはエイリアスかもしれません!クレイジーなもの。
    • Railsのwhereのパラメーターとしてサブクエリを使用できます 方法は問題ありません。


    1. MySQLで絵文字を検索する

    2. var_dumpをテキストファイルに保存します

    3. スーパーストリングクエリ用にデータベースを最適化するにはどうすればよいですか?

    4. エラー1356(HY000):ビュー'mysql.user'が無効なテーブルまたは列または関数を参照しているか、ビューの定義者/呼び出し元にそれらを使用する権限がありません