Mysql Rails高级sql查询
我有一个模范用户,他有很多用户权利。我想获得所有具有预览属性且没有用户权限的用户 我的代码当前为:Mysql Rails高级sql查询,mysql,ruby,ruby-on-rails-3,activerecord,Mysql,Ruby,Ruby On Rails 3,Activerecord,我有一个模范用户,他有很多用户权利。我想获得所有具有预览属性且没有用户权限的用户 我的代码当前为: User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?} 这是对所有用户进行迭代,看看他们是否有任何用户权限 有没有一种方法可以在SQL中实现这一点,以提高效率并避免对每个用户进行检查?您可以使用Arel来构建一个查询,利用不存在 user_arel = User.arel_table ue_
User.where("preview is not null").keep_if {|user| user.user_entitlements.empty?}
这是对所有用户进行迭代,看看他们是否有任何用户权限
有没有一种方法可以在SQL中实现这一点,以提高效率并避免对每个用户进行检查?您可以使用Arel来构建一个查询,利用
不存在
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
)
我假设您的模式中userentity
包含user\u id
列。更简单的是,您可以使用includes
强制左连接,然后检查NULL:
User.includes(:user_entitlements).
where("users.preview IS NOT NULL AND user_entitlements.id IS NULL")
如果有一个大的数据集,您通常会看到不存在时的性能优于左连接时的性能。来源:编辑:澄清您经常看到更好的性能,考虑到PinnyM下面的评论。@DanReedy,这将取决于DBMS和版本-只有查询优化器可以确定特定查询和分析的性能。您链接的文章来自3.5年前,是特定于SQL Server的。我不确定当前版本的MySQL(或SQL Server)在这方面是否更好,但这需要确定。@DanReedy,我确实更喜欢你的方法,顺便说一句,但是ActiveRecord手工写出来会很麻烦。遗憾的是,没有一个gem可以将其添加为本机行为,因为这是一个相当常见的场景。也许有一天。。。