【问题标题】:Difficulty in understanding a Join query难以理解 Join 查询
【发布时间】:2015-10-13 13:03:25
【问题描述】:

我在我正在从事的项目中使用以下方法进行多重连接。我不明白这里发生了什么 |操作员。任何解释将不胜感激。

  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

【问题讨论】:

  • 我没有使用 ruby​​ 或 activerecord 的经验,但这似乎只是 WHERE 子句中的 OR 条件。
  • 这没有多大意义。 OR 的左边部分总是真实的(意思是,右边部分永远不会被评估)
  • 另外,您是重新输入代码还是复制/粘贴?你有一个反引号而不是引号。
  • 我完全错了。检查更新的答案:)

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


【解决方案1】:

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

Set Union — 通过将 aryother_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 上定义的。

【讨论】:

  • 这应该是答案:)
【解决方案2】:

事实证明,我完全错了。这不是布尔或,这是按位或。它使一切变得不同。

显然,当您在这样的两个活动关系查询上调用它时,它会执行这两个查询并生成结果的联合。 (在 mongoid 查询上测试,不是 activerecord,但在 AR 中应该是一样的,我想)

【讨论】:

  • 你的意思是即使 a 是一个空的 ActiveRecord 关系也会是真的?
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2014-11-15
  • 2014-05-16
相关资源
最近更新 更多