2012-01-07 68 views
2

型号/ host.rbRails 3中,选择的has_many(LEFT JOIN)

class Host < ActiveRecord::Base 
    has_many :report, :dependent => :delete_all 
end 

型号/ report.rb

class Report < ActiveRecord::Base 
    belongs_to :host 
end 

现在我要选择与自己的报告中的所有主机包括未收到任何举报的主持人。

我试图通过

list=Host.all(:joins => "left join `reports` on reports.host_id=host.id") 

来实现这一点,但它似乎像Rails的唯一选择从hosts表的字段。所以我无法通过list[0].report访问报表对象。 另外,如果不使用原始SQL命令,我会更高兴地做出选择 - 以更像ruby的方式。

如何在只有一个选择并且不使用SQL的情况下获得主机和报告?

回答

1

你可以做

Host.eager_load(:reports) 

这将加盟报告表并实例化所有报告对象。您可以使用完全一样,如果他们被点播

+0

非常感谢!这正是我正在寻找的。 – gorootde 2012-01-07 17:11:25

0

列表= Host.joins( “左连接上reports.host_id = host.id reports”)

此代码不生成报表对象对你的,只有主机。 但是主机对象现在从报告表 contins临时属性,你可以访问它们

列表[0] [:column_name_from_reports_table]

+0

这就是我也期待的,不幸的是'list [0] .inspect'只显示hosts表中的属性。日志还声明'SELECT主机。* FROM ...'被执行。 – gorootde 2012-01-07 16:57:25

0

如果您希望从其他比主机表选择字段加载的加载主机和报告,你可以随时使用select method这样做。

Host.joins('left join reports on reports.host_id = hosts.id').select('reports.id, reports.column1, reports.column2, hosts.column1')等等等等。

这是导轨的最佳功能之一,在许多情况下,您只能在一行中获得所需的结果。