Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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
Sql 合并两个活动记录查询的结果_Sql_Ruby On Rails - Fatal编程技术网

Sql 合并两个活动记录查询的结果

Sql 合并两个活动记录查询的结果,sql,ruby-on-rails,Sql,Ruby On Rails,我想合并以下查询的结果: Dispenser.includes(:reviews).where.not(reviews: { id: nil }) 及 我曾尝试在这两个查询的中间放置一个 >代码>,但是这并没有给出预期的结果。我想查找所有具有审查或分发器审查的分发器 假设我在每个查询中都有以下分发器ID: [1,2,3]和[2,3,4] 输出应该是由ID表示的分配器[1,2,3,4]您可以使用而不是活动记录来完成。它提供了Arel没有的现成功能 话虽如此,你的逻辑会很糟糕。如果您想要得到结果集

我想合并以下查询的结果:

Dispenser.includes(:reviews).where.not(reviews: { id: nil })

我曾尝试在这两个查询的中间放置一个<代码> >代码>,但是这并没有给出预期的结果。我想查找所有具有

审查
分发器审查
的分发器

假设我在每个查询中都有以下分发器ID:

[1,2,3]
[2,3,4]


输出应该是由ID表示的分配器
[1,2,3,4]

您可以使用而不是活动记录来完成。它提供了Arel没有的现成功能

话虽如此,你的逻辑会很糟糕。如果您想要得到结果集,并且不介意两个查询而不是一个查询,那么我就用
+
操作符将两个结果连接起来

r1 = Dispenser.includes(:reviews)# ...
r2 = Dispenser.includes(:dispenser_reviews)# ...
result = r1 + r2
作为一个挤压的例子,它应该是这样的:

Dispenser.includes{reviews}.
  includes{dispenser_reviews}.
  where{(reviews.id.not_eq nil) | {dispenser_reviews.id.not_eq nil)}.
  references(:all)

您还可以使用arel并将两个查询合并为一个查询,如下所示:

Dispenser.includes(:reviews, :dispenser_reviews).where((Review.arel_table[:id].not_eq(nil)).or DispenserReview.arel_table[:id].not_eq(nil)).references(:reviews, :dispenser_reviews)

联接将执行内部联接,并且仅返回具有审阅或分发器\u审阅的分发器对象。管道“|”将清除DUP

Dispenser.joins(:reviews) | Dispenser.joins(:dispenser_reviews)
或者去拿身份证

Dispenser.joins(:reviews).pluck(:id) | Dispenser.joins(:dispenser_reviews).pluck(:id)

您能详细说明一下如何使用squeel来实现这一点吗?谢谢。哦,我想你已经为我解决了它是(r1+r2)。uniq这是我的分发器作用域的模型作用域:with_reviews,->{(includes(:reviews)。where.not(reviews:{id:nil})+includes(:Dispenser_reviews)。where.not(Dispenser_reviews:{id:nil}))。uniq}是的,我不完全确定它是否在一个作用域内工作,也许是这样。如果没有,您也可以用相同的逻辑定义一个类方法。它似乎可以工作。。结果集有一些重叠,但输出计数是正确的。ActiveRecord::StatementInvalid:Mysql2::Error:where子句中的未知列“reviews.id”:从
分发器
中选择计数(*),其中(
审查
id
不为空或
分发器\u审查
id
不为空))重新读取错误时,上述查询(在回答中)无法生成错误中显示的sql查询。我建议完全复制它!如果需要计数,请在查询末尾添加一个
.count
Dispenser.joins(:reviews).pluck(:id) | Dispenser.joins(:dispenser_reviews).pluck(:id)