我正在尝试执行与此类似的操作: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')
但是,当然,Policy
和Model
之间没有直接关联,我得到missing FROM-clause entry for table "address"
。我真的不想添加Policy > Address
关联,因为其他模型有地址并且属于政策。
答案 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查询的好处,因为您在一次查询中吞噬了所有数据。