1

初心者 Rails の質問...もっと良い方法があることは知っています。これが思ったように機能しない理由を理解する助けが必要です。既存のデータベースとの「has_many」関係を使用して単純な結合テーブルを作成しています。「非レール」のフレンドリーなタイトルを保持する必要があります。

ブラウザに表示される <%= room.levels %> の出力は次のとおりです。[#<Level Name: "01 - FIRST FLOOR">] 01 - FIRST FLOOR だけを表示したいのですが、他のすべての情報は表示されません。

私は2つのテーブルを持っています。:部屋と:レベル

2 つのテーブルのスキーマは次のとおりです。

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

あなたの現在のスキーマ、ルームの属しているレベルでは、部屋が多くのレベルを持つことはできません(その2つのテーブルだけでない限り)

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 に答える