Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Rails高级sql查询_Mysql_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

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可以将其添加为本机行为,因为这是一个相当常见的场景。也许有一天。。。