我有一个模型User hass has_many user_entitlements。我想让所有具有预览属性但没有用户权利的用户。
我的代码目前是:
User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?}
这是遍历所有用户并查看他们是否拥有任何用户权利。
我有没有办法在SQL中做到这一点,以提高效率,避免不得不通过每个用户?
答案 0 :(得分: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
列。
答案 1 :(得分:1)
更简单的是,您可以使用includes
强制LEFT JOIN,然后检查NULL:
User.includes(:user_entitlements).
where("users.preview IS NOT NULL AND user_entitlements.id IS NULL")