0

我有一个模型用户,即 has_many user_entitlements。我想获取所有具有预览属性且没有用户权利的用户。

我的代码目前是:

User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?}

这是遍历所有用户并查看他们是否有任何用户权利。

有没有一种方法可以在 SQL 中执行此操作以提高效率并避免必须通过每个用户?

4

2 回答 2

1

您可以使用 Arel 构建查询,利用NOT EXISTS.

user_arel = User.arel_table
ue_arel = UserEntitlement.arel_table
User.where("preview is not null").where(
  UserEntitlement.where(ue_arel[:user_id].eq(user_arel[:id])).exists.not
)

我正在对UserEntitlement包含user_id列的架构做出假设。

于 2013-05-01T16:33:21.950 回答
1

更简单的是,您可以使用includes强制 LEFT JOIN,然后检查 NULL:

User.includes(:user_entitlements).
     where("users.preview IS NOT NULL AND user_entitlements.id IS NULL")
于 2013-05-01T17:11:16.697 回答