1

我有一个用户模型和一个身份验证模型。一个User has_many Authentications

我想创建一个查询来检查所有具有名为“Facebook”的身份验证名为“LinkedIn”的身份验证的用户。

我已经尝试加入两次,但这没有奏效:

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

它导致了以下查询。似乎删除了其中一个连接:

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

编辑:

这对我有用,但是,我必须加入用户表两次,我不想这样做:

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

1 回答 1

1

要实现这一点,您确实可以加入同一张表两次。我不确定 AR 将如何处理.joins带有符号参数的两个调用,但你肯定可以这样做:

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 回答