加入时这两个查询之间的差异,包括使用合并

时间:2018-04-13 09:27:54

标签: mysql ruby-on-rails

所以基本上我在rails控制台中尝试了一些东西,我发现在使用连接和包含查询时存在一些差异。我知道它们之间的区别,例如使用join的延迟加载和使用includes的eager loading。但是下面的代码似乎让我感到困惑,它们是否有所不同,为什么不与包含合并。

Table1.joins(:table2).merge(Table2.where(field_of_table2: "value")

Table1.joins(:table2).where(:table2 => {field_of_table2: "value"})

两者似乎都给了我相同的结果。

Table1.includes(:table2).merge(Table2.where(field_of_table2: "value")

合并似乎不适用于包括,但

Table1.includes(:table2).where(:table2 => {field_of_table2: "value")

工作但又生成一个复杂的sql语句。

我是新手,请帮助我理解使用这两个陈述的任何不良影响。 如果需要,我会很高兴发布sql语句。

1 个答案:

答案 0 :(得分:0)

合并 - 如果table2是ActiveRecord :: Relation,则合并table2中的条件。如果table2是数组,则返回表示结果记录与table2的交集的数组。

其中 - 返回一个新关系,它是根据参数中的条件过滤当前关系的结果。

其中基本上过滤当前关系给出条件但合并返回其他关系的公共行。

例如。

class Book < ActiveRecord::Base
  scope :available, where(:available => true)
end

class Author < ActiveRecord::Base
  has_many :books
  scope :with_available_books, joins(:books).merge(Book.available)
end


Author.with_available_books

上述状态归还所有书籍,包括可用书籍。