我有一个模型用户,即 has_many user_entitlements。我想获取所有具有预览属性且没有用户权利的用户。
我的代码目前是:
User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?}
这是遍历所有用户并查看他们是否有任何用户权利。
有没有一种方法可以在 SQL 中执行此操作以提高效率并避免必须通过每个用户?
我有一个模型用户,即 has_many user_entitlements。我想获取所有具有预览属性且没有用户权利的用户。
我的代码目前是:
User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?}
这是遍历所有用户并查看他们是否有任何用户权利。
有没有一种方法可以在 SQL 中执行此操作以提高效率并避免必须通过每个用户?
您可以使用 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
列的架构做出假设。
更简单的是,您可以使用includes
强制 LEFT JOIN,然后检查 NULL:
User.includes(:user_entitlements).
where("users.preview IS NOT NULL AND user_entitlements.id IS NULL")