1

ユーザーモデルと認証モデルがあります。User has_many Authentications。_

「Facebook」という認証と「 LinkedIn 」という認証を持つすべてのユーザーをチェックするクエリを作成したいと思います。

2回参加しようとしましたが、うまくいきませんでした。

User.joins(:authentications).
where(authentications: {provider: 'facebook'}).
joins(:authentications).
where(authentications: {provider: 'linkedin'})

その結果、次のクエリが発生しました。結合の1つが削除されたようです:

SELECT "users".* FROM "users" INNER JOIN "authentications"
ON "authentications"."user_id" = "users"."id"
WHERE "authentications"."provider" = 'facebook' AND "authentications"."provider" = 'linkedin'

編集:

これは私にとってはうまくいきましたが、ユーザーテーブルに2回参加する必要がありましたが、これはやりたくないことです。

joins(authentications:{ user: :authentications }).where(authentications: {provider: 'facebook'}).where(authentications_users: {provider: 'linkedin'})
4

1 に答える 1

1

これを実現するために、実際に同じテーブルを2回結合できます。ARが.joinsシンボル引数を使用して2つの呼び出しをどのように処理するかはわかりませんが、次のようなことは確実に実行できます。

User.joins("INNER JOIN authentications AS a1 ON a1.user_id = users.id").
     joins("INNER JOIN authentications AS a2 ON a2.user_id = users.id").
     where("a1.provider = 'linkedin'").where("a2.provider = 'facebook'")

最終的には低レベルのSQLを作成することになりますが、この方法で必要なものを取得できるようになります。

于 2012-11-18T09:56:27.913 に答える