1

新手 Rails 问题...我知道有更好的方法来做到这一点。我需要帮助来理解为什么这不能像我认为的那样工作。我正在使用与预先存在的数据库的“has_many”关系做一个简单的连接表。我需要保留“非导轨”友好的标题。

这是在浏览器中看到的输出 <%= room.levels %>:[#<Level Name: "01 - FIRST FLOOR">] 我只想看到 01 - FIRST FLOOR 而没有所有其他信息。

我有两张桌子。:rooms 和 :levels

这是两个表的架构:

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

这是 app/model/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

这是来自 app/views/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>

谢谢!

4

3 回答 3

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.
于 2013-08-23T17:08:38.423 回答
0

因为levels给你一个集合回来。你需要迭代room.levels并在那里你得到元素

于 2013-08-23T17:06:58.243 回答
0

使用您当前的 Schema,Room 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>
于 2013-08-23T17:17:55.863 回答