2012-01-07 103 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')等等等等。

這是導軌的最佳功能之一,在許多情況下,您只能在一行中獲得所需的結果。