2017-02-17 56 views
1

我正试图做类似于这样的事情:Rails order by association field,只有关联的表。我有三个型号:使用嵌套连接构建一个ActiveRecord - Rails 4

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关联,因为还有其他有地址并属于策略的模型。

+0

你想'@ report.includes(clients:[:addresses])'因为地址是客户端的关联,而不是Policy的关联。这将解决N + 1问题。如果你想排序,那么你会想要加入。 – mroach

+0

**客户:[:地址]'(单数)客户属于地址。 (':address:')。(客户端:[:地址])。仍然得到'丢失表的地址'的FROM子句条目' desc')。ids' –

+0

尝试:'@ report.joins(clients:[:address])'我建议在rails控制台中执行此操作,或者拖尾查找development.log文件,以便查看正在生成的SQL。 – mroach

回答

1

您想要执行的操作是将SQL JOIN添加到表中,然后按该表的名称和table.field表示法中的字段进行排序。

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

这里是发生了什么事情:

joins方法我们说我们想要的clients关系address关系被包含在一个单一的查询。我们使用,因为这是基础表的名称。如果您不确定,请尾记录日志文件(例如log/development.log)或使用Rails控制台查看生成的SQL。

这种方法有利于减少N + 1查询,因为您在一个查询中吞噬了所有数据。

+0

绝对!我也在'.order'中调用'clients.addresses'。 –