2011-01-26 46 views
0

問候 我有3個數據庫表:使用:聯接在Ruby on Rails的3個

類型 ID 名

來源 ID 名 TYPE_ID

操作 id SOURCE_ID 評論 ...

和模型爲每個:

class Type < ActiveRecord::Base 
    has_many :sources, :dependent => :destroy 
end 

class Source < ActiveRecord::Base 
    belongs_to :type 
    has_many :operations, :dependent => :destroy 
end 

class Operation < ActiveRecord::Base 
    belongs_to :source 
    default_scope :order => 'created_at DESC' 
end 

在操作#索引器我有獲取數據的代碼(由腳手架生成)

@operations = Operation.all 

和計件的觀點operations/index.html.erb也由腳手架生成

<% @operations.each do |operation| %> 
    <tr> 
    <td><%= operation.source_id %></td> 
    <td><%= operation.comment %></td> 
    </tr> 
<% end %> 

現在我想用source.name而不是* operation.source_id *

我試圖做的:

-replace operation.source_id到operation.sources.name#不起作用

-tried使用:連接,並不能得到源表中的字段

irb(main):057:0> Operation.first(:joins => :source) 
=> #<Operation id: 2088, source_id: 1, summ: 10.0, comment: "", created_at: "2011-01-01 07:39:45", updated_at: nil> 

irb(main):063:0> Operation.first(:joins => 'INNER JOIN sources ON operations.source_id = sources.id') 
=> #<Operation id: 2088, source_id: 1, summ: 10.0, comment: "", created_at: "2011-01-01 07:39:45", updated_at: nil> 

我該如何正確使用:加入獲取更多字段? 或者還有另一種方法來獲取組合表數據。

爲什麼在操作/ show.html.erb我可以使用<%= @ operation.source.name%>並順利拿到source.name,但在*操作/指數。 html.er * b不能

回答

2
<% @operations.each do |operation| %> 
    <tr> 
    <td><%= operation.source.name %></td> 
    <td><%= operation.comment %></td> 
    </tr> 
<% end %> 

我也建議改變你的#index方法使用一個includes語句來避免N + 1個的情況(即運行的每個單獨操作的源一個單獨的數據庫查詢)。

@operations = Operation.includes(:source).all 
+0

這不起作用。 控制檯: irb(main):011:0 * Operation.includes(:source).first =>#<操作ID:2088,source_id:1,summ:10.0,comment:「」,created_at:「2011- 01-01 07:39:45「,updated_at:nil 瀏覽器: 未定義的方法`name'爲零:NilClass – ck3g 2011-01-27 06:22:00

+0

在控制檯中做了如下操作:`Operation.includes(:source).first .source.name`?由於你在nil上得到了未定義的方法,這可能表明你有一些沒有鏈接到任何源的操作對象。如果是這種情況,那是故意的,你可能想使用`<%= operation.source? operation.source.name:「No Source」%>`。 – 2011-01-27 06:33:22

0

解決:

opearions#指數

@operations = Operation.all :joins => :source, :select => '*' 

操作/ index.html的。erb

<% @operations.each do |operation| %> 
    <tr> 
    <td><%= operation.name %></td> 
...