难以理解Join查询

时间:2015-07-23 09:45:16

标签: ruby-on-rails join rails-activerecord

我在我正在处理的项目中有多个连接的跟随方法。我不明白这里发生了什么运营商。任何解释都将受到高度赞赏。

  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

2 个答案:

答案 0 :(得分:2)

这是Array#|, or a "set union"

  

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中它应该是相同的,我想)