我在我正在处理的项目中有多个连接的跟随方法。我不明白这里发生了什么运营商。任何解释都将受到高度赞赏。
class SampleUnit < ActiveRecord::Base
def unit_code(code)
joins(table_a: [:table_b]).
eager_load(table_a: [:table_b]).
eager_load(:table_c).
eager_load(:table_d).
eager_load(:table_e).
where(‘table_b.code like ?', code) |
eager_load(table_a: [: table_b]).
eager_load(: table_c).
eager_load(: table_d).
eager_load(: table_e).
where('sample_units.code like ?',(code))
end
end
答案 0 :(得分:2)
Set Union - 将
ary
加入other_ary
,返回一个新数组, 排除任何重复项并保留原始数组中的顺序。它使用
#hash
和#eql?
方法比较元素的效率。[ "a", "b", "c" ] | [ "c", "d", "a" ] #=> [ "a", "b", "c", "d" ]
另见
Array#uniq
。
ActiveRecord::Relation
包含一个Delegation
模块,该模块将对一堆方法*的调用转发给在该关系上调用to_a
的结果。
当然,这意味着它不是单个查询,而是由Ruby代码处理结果的两个查询:例如,这使得无法批量获取巨大的行集(即大于RAM)。在Rails中建立SQL联合是awkwardly hard,但也可以。
* 基本上,所有方法都没有在Relation
本身上定义,而是在Array
而非blacklisted上定义。
答案 1 :(得分:1)
原来,我完全错了。这不是布尔OR,这是按位OR。它使一切变得不同。
显然,当您在两个活动关系查询上调用它时,它会执行两个查询并生成结果的联合。 (在mongoid查询测试,不是activerecord,但在AR中它应该是相同的,我想)