Rails高级sql查询

时间:2013-05-01 16:22:44

标签: mysql ruby ruby-on-rails-3 activerecord

我有一个模型User hass has_many user_entitlements。我想让所有具有预览属性但没有用户权利的用户。

我的代码目前是:

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

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

我有没有办法在SQL中做到这一点,以提高效率,避免不得不通过每个用户?

2 个答案:

答案 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")