使用嵌套连接构造ActiveRecord - Rails 4

时间:2017-02-17 03:29:30

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

我正在尝试执行与此类似的操作:Rails order by association field,仅使用关联的表。我有三种模式:

class Policy
  has_many :clients
end

class Client
  belongs_to :policy
  belongs_to :address
end

class Address
end

并希望创建一个报告集合,其中包含具有关联客户端及其地址的策略。类似的东西:

@report = Policy.where(...)
@report.includes(:clients, :addresses).order('clients.address.state desc')

但是,当然,PolicyModel之间没有直接关联,我得到missing FROM-clause entry for table "address"。我真的不想添加Policy > Address关联,因为其他模型有地址并且属于政策。

1 个答案:

答案 0 :(得分:3)

您要做的是对表格的SQL JOIN,然后按该表格的名称和table.field表示法中的字段排序。

@reports.joins(clients: [:address]).order('addresses.state')

这是&#39>正在进行的事情:

joins方法中,我们说我们希望clients关系将其address关系包含在单个查询中。< / p>

接下来,使用order我们使用addresses,因为它是基础表的名称。如果您不确定,请将日志文件(例如log/development.log)拖尾或使用Rails控制台查看生成的SQL。

这种方法还有减少N + 1查询的好处,因为您在一次查询中吞噬了所有数据。