Rails-親IDが子の関連付けのいずれにも含まれていないオブジェクトを取得します

マリウスW

私はこれらの2つのモデルを持っています:

Collabs
- id
- title
# has_many :collaborations

Collaborations
- collab_id
- user_id
- status
# belongs_to :collab
# belong_to :user

クエリでは、特定のuser_idが子(コラボレーション)の関連付けに存在しないすべてのコラボレーションをフェッチする必要はありません。コラボレーションには0から多数のコラボレーションを含めることができ、コラボレーションには異なるuser_idがあります。

私は(スコープを使用して)試しました:

collabs = Collab.available_for_user(2)

scope :available_for_user, -> (user_id) { joins(:collaborations).where.not(collaborations: {user_id: user_id}) }

私も試しました:

scope :available_for_user, -> (user_id) { left_outer_joins(:collaborations).where.not(collaborations: {user_id: user_id}) }

これは、コンソールに出力されるSQLです。

SELECT "collabs".* FROM "collabs" LEFT OUTER JOIN "collaborations" ON "collaborations"."collab_id" = "collabs"."id" WHERE ("collaborations"."user_id" != $1)  [["user_id", 13]]

これは、子アソシエーションに指定されたuser_idのみがあり、コラボに別のuser_idとの別のコラボレーションがある場合に機能し、このコラボは上記のスコープでフェッチされます。

イリヤ・コニュホフ

これはあなたの呼び出しです:

Collab.find_by_sql [
  "SELECT *
  FROM collabs
  WHERE id NOT IN (
      SELECT C.id
      FROM collabs C
      JOIN collaborations CL ON CL.collab_id = C.id
      WHERE CL.user_id = :user_id)",
  { user_id: user_id }
]

説明:選択したuser_idのコラボレーションがないコラボをフェッチするには、そのコラボがあるコラボを見つけて除外する必要があります。:)

SQLがなく、プレーンなRubyを使用すると、次のように記述できます。

Collab.where.not(
  id: Collab.joins(:collaborations)
            .where(collaborations: { user_id: user_id })
            .pluck(:id)
)

または、詳細:

# Inner query to find collabs with collaborations for given user_id:
#   SELECT C.id
#   FROM collabs C
#     JOIN collaborations CL ON CL.collab_id = C.id
#   WHERE CL.user_id = :user_id
ids = Collab.joins(:collaborations)
            .where(collaborations: { user_id: user_id })
            .pluck(:id)

# Final query:
#   SELECT *
#   FROM collabs
#   WHERE id NOT IN :ids
Collab.where.not(id: ids)

最初のケース(find_by_sql)では1つではなく2つのSQL呼び出しが生成されるため、パフォーマンスのためにそうしないでください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

親を保存せずに、Railsのオブジェクトに子の関連付けを構築するにはどうすればよいですか?

分類Dev

Rails-関連付けの値に基づいてオブジェクトを検索します

分類Dev

Railsフォームは、親オブジェクトに関連付けられた複数のオブジェクトを作成します

分類Dev

Rails:関連付けがX未満のモデルを検索します。関連付けがないモデルも含まれます。

分類Dev

Rails:すべての関連付けが条件を満たすオブジェクトのみを返します

分類Dev

値が親または関連付けに存在するかどうかを確認し、Railsで親オブジェクトを取得します

分類Dev

Railsは、関連付けられたIDの配列を使用してオブジェクトをレンダリングします

分類Dev

Ruby on Railsは、別の関連付けもある関連付けられたオブジェクトを見つけます

分類Dev

Rails5、ネストされた形式の許可されていないパラメーター、既存のオブジェクトの関連付け

分類Dev

Rails 4のJSONには、オブジェクトのすべてのフィールドが含まれているわけではありません

分類Dev

Rails 5:新しいアクションと作成アクションの間にオブジェクトの親IDが失われます

分類Dev

AssociationTypeMisMatch:JSONを受け入れるRESTful API(Rails)を使用して、オブジェクトおよび関連付けられた(ネストされた)オブジェクトを作成するにはどうすればよいですか?

分類Dev

Railsはタグ付け可能として機能し、特定のタグを持つすべての関連オブジェクトを取得します

分類Dev

Rails / Mongoid:mongoimport後にhas_many / belongs_to関係の子を認識しない親オブジェクト

分類Dev

Ruby on Rails:DBに新しいオブジェクトを作成するためのフォームが含まれていると、なぜ空の値が表示されるのですか?

分類Dev

Rails-含まれているオブジェクトを破棄した後にliを削除する

分類Dev

ビューのボタンからカスタム メソッドを呼び出して、オブジェクトに関連付けられたファイルを削除するにはどうすればよいですか? Railsアプリ

分類Dev

Rails-条件付きのオブジェクトから関連付けを破棄します

分類Dev

関連付けられたオブジェクトなしでオブジェクトを表示するスコープの作成-Rails4

分類Dev

Rails 4to_jsonにはすべての関連付けが含まれます

分類Dev

Railsコントローラーインデックスは関連付けられたオブジェクトのみを表示します

分類Dev

Rails:ユーザーIDが関連付けられたテーブルに格納されているユーザーを検索します

分類Dev

Ruby On Rails:ラジオボタンの関連するdivを表示/非表示にする方法がチェックされています

分類Dev

Rails4で深くネストされた子オブジェクトのセットのすべての親の親を検索します

分類Dev

Rails 4アクティブレコード。シリアル化された配列属性が別の配列に含まれているかどうかを確認して、オブジェクトを検索します

分類Dev

Rails 4.0-子オブジェクトのIDに基づいてオブジェクトのコレクションを取得するにはどうすればよいですか?

分類Dev

Railsはモデルのエラーメッセージに関連付けられています

分類Dev

Railsでは、オブジェクトの配列に特定の値に一致する特定の属性が含まれているかどうかをどのように判断しますか?

分類Dev

Railsでオブジェクトをフィルタリングして、オブジェクトを作成したユーザーまたは管理者だけがそのオブジェクトを破棄できるようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    親を保存せずに、Railsのオブジェクトに子の関連付けを構築するにはどうすればよいですか?

  2. 2

    Rails-関連付けの値に基づいてオブジェクトを検索します

  3. 3

    Railsフォームは、親オブジェクトに関連付けられた複数のオブジェクトを作成します

  4. 4

    Rails:関連付けがX未満のモデルを検索します。関連付けがないモデルも含まれます。

  5. 5

    Rails:すべての関連付けが条件を満たすオブジェクトのみを返します

  6. 6

    値が親または関連付けに存在するかどうかを確認し、Railsで親オブジェクトを取得します

  7. 7

    Railsは、関連付けられたIDの配列を使用してオブジェクトをレンダリングします

  8. 8

    Ruby on Railsは、別の関連付けもある関連付けられたオブジェクトを見つけます

  9. 9

    Rails5、ネストされた形式の許可されていないパラメーター、既存のオブジェクトの関連付け

  10. 10

    Rails 4のJSONには、オブジェクトのすべてのフィールドが含まれているわけではありません

  11. 11

    Rails 5:新しいアクションと作成アクションの間にオブジェクトの親IDが失われます

  12. 12

    AssociationTypeMisMatch:JSONを受け入れるRESTful API(Rails)を使用して、オブジェクトおよび関連付けられた(ネストされた)オブジェクトを作成するにはどうすればよいですか?

  13. 13

    Railsはタグ付け可能として機能し、特定のタグを持つすべての関連オブジェクトを取得します

  14. 14

    Rails / Mongoid:mongoimport後にhas_many / belongs_to関係の子を認識しない親オブジェクト

  15. 15

    Ruby on Rails:DBに新しいオブジェクトを作成するためのフォームが含まれていると、なぜ空の値が表示されるのですか?

  16. 16

    Rails-含まれているオブジェクトを破棄した後にliを削除する

  17. 17

    ビューのボタンからカスタム メソッドを呼び出して、オブジェクトに関連付けられたファイルを削除するにはどうすればよいですか? Railsアプリ

  18. 18

    Rails-条件付きのオブジェクトから関連付けを破棄します

  19. 19

    関連付けられたオブジェクトなしでオブジェクトを表示するスコープの作成-Rails4

  20. 20

    Rails 4to_jsonにはすべての関連付けが含まれます

  21. 21

    Railsコントローラーインデックスは関連付けられたオブジェクトのみを表示します

  22. 22

    Rails:ユーザーIDが関連付けられたテーブルに格納されているユーザーを検索します

  23. 23

    Ruby On Rails:ラジオボタンの関連するdivを表示/非表示にする方法がチェックされています

  24. 24

    Rails4で深くネストされた子オブジェクトのセットのすべての親の親を検索します

  25. 25

    Rails 4アクティブレコード。シリアル化された配列属性が別の配列に含まれているかどうかを確認して、オブジェクトを検索します

  26. 26

    Rails 4.0-子オブジェクトのIDに基づいてオブジェクトのコレクションを取得するにはどうすればよいですか?

  27. 27

    Railsはモデルのエラーメッセージに関連付けられています

  28. 28

    Railsでは、オブジェクトの配列に特定の値に一致する特定の属性が含まれているかどうかをどのように判断しますか?

  29. 29

    Railsでオブジェクトをフィルタリングして、オブジェクトを作成したユーザーまたは管理者だけがそのオブジェクトを破棄できるようにするにはどうすればよいですか?

ホットタグ

アーカイブ