2013-08-23 22 views
1

Newbie Rails的問題...我知道有一個更好的方法來做到這一點。我需要幫助理解爲什麼這不像我認爲的那樣工作。 我正在做一個簡單的連接表與一個預先存在的數據庫使用「has_many」關係。我需要保持「非鐵軌」友好的頭銜。has_many加入顯示問題

下面是輸出<%= room.levels%>如出現在瀏覽器:[#<Level Name: "01 - FIRST FLOOR">] 我想只看到01 - 一樓,沒有所有的其他信息。

我有兩個表。 :辦公室:水平

這裏的架構的兩個表:

create_table "levels", :primary_key => "Id", :force => true do |t| 
t.integer "TypeId" 
t.integer "DesignOption" 
t.string "Name" 
t.float "Elevation" 

create_table "rooms", :primary_key => "Id", :force => true do |t| 
t.integer "DesignOption" 
t.integer "PhaseId" 
t.string "Comments" 
t.float "Volume" 
t.float "Perimeter" 
t.integer "Level" 
t.string "Occupancy" 
t.float "Area" 
t.string "Number" 
t.string "Name" 
end 

add_index "rooms", ["Id"], :name => "Id", :unique => true 

這裏的應用程序/模型/ room.rb:

class Room < ActiveRecord::Base 
    attr_accessible :Area, :Level, :Name, :Number, :Perimeter, :PhaseId, :Elevation 
    has_many :levels, :primary_key => 'Level', :foreign_key => 'Id', :select => 'Name' set_primary_key :Id 
end 

下面是來自應用程序/意見片斷/ rooms/index.html.erb:

<% @rooms.each do |room| %> 
    <tr> 
    <td><%= room.Name %></td> 
    <td><%= room.Number %></td> 
    <td><%= room.PhaseId %></td> 
    <td><%= room.levels %></td> 
    <td><%= link_to 'Show', room %></td> 
    <td><%= link_to 'Edit', edit_room_path(room) %></td> 
    <td><%= link_to 'Destroy', room, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 

謝謝!

+0

按照慣例(和導軌強調約定!)您的屬性/方法的名字(例如'Name','Number',...)應小寫 – mdemolin

+1

這個問題的作者明確地說:「'我需要保持「非鐵軌」友好的頭銜。「 – MrYoshiji

+0

使用從建築軟件存在的出口...寧願保持數據完好無損。 – dmet

回答

1

你可以這樣做:

<td><%= room.levels.map(&:Name).join(', ') %></td> 

爲什麼你的代碼沒有放在首位工作?因爲room.levels返回一個Level對象的數組。您需要遍歷它們以獲取每個名稱,然後顯示它。

room.levels 
# => returns all the level objects associated 

room.levels.map(&:Name) 
# => collect each name of the level objects (makes an array of (String) names) 

room.levels.map(&:Name).join(', ') 
# => Return a nice String with all the levels name with ", " between each. 
+0

謝謝!你搖滾!​​<%= room.levels.map(&:Name).join(',')%> – dmet

0

因爲levels給你回收。您需要遍歷room.levels,有你的元素

0

與你目前的架構,房belongs_to的水平,沒有辦法一個房間可以有多個層次(除非不是隻有兩個表)

create_table "rooms", :primary_key => "Id", :force => true do |t| 
... 
t.integer "Level" # One-to-One relation 

所以,你需要的是一樣的東西:

# Model 
class Room < ActiveRecord::Base 
    attr_accessible :Area, :Level, :Name, :Number, :Perimeter, :PhaseId, :Elevation 
    belongs_to :level, :primary_key => 'Level', :foreign_key => 'Id', :select => 'Name' 

end 

# View 
<td><%= room.level.name %></td>