2010-02-22 50 views
0
一週

我有用於存儲各個房間的價格一組嵌套模式的天。軌構建複雜的模型方法與

即,

Places 
    Rooms 
     Room_rates 

每個模型都有必要accepts_nested_attributes_for和的has_many belongs_to的關聯,我有一種形式,它完全適用於初始創建的build方法。

我的問題是如何做出更明智的控制器,要麼構建領域,如果它不存在,或從中讀取,如果它(並且不建立的話)。目前它只適用於初始輸入,否則它會嘗試構建比可能的更多的字段,並在重新提交時中斷。

def new 
    @place = Place.find(params[:place_id]) 
    @rooms = @place.rooms 

    @rooms.each do |r| 
     7.times { r.room_rates.build } #days of the week 
    end 

    end 

試圖

@rooms.each do |r| 
    7.times { 
    unless r.room_rates 
     r.room_rates.build 
    end 
    } 
end 

數據庫room_rates

id, room_id, dayofweek, price 

形式

<% form_for @place do |f| %> 
    <%= f.error_messages %> 


<table> 
    <tr> 
    <th>Room</th> 
    <th>Mon</th> 
    <th>Tue</th> 
    <th>Wed</th> 
    <th>Thu</th> 
    <th>Fri</th> 
    <th>Sat</th> 
    <th>Sun</th> 
    </tr> 
    <% f.fields_for :rooms do |room| %> 
    <% dow = 0 %> 
     <tr> 
     <td><%= room.text_field :name %></td> 

     <% room.fields_for :room_rates do |rates| %> 

      <td>  
       <%= rates.text_field :price %> 
       <%= rates.text_field :dayofweek, :value => dow %> 
      </td> 
      <% dow += 1 %> 
     <% end %> 
     </tr> 
    <% end %> 
</table> 

<%= f.submit "Submit" %> 

<% end %> 

回答

1

你可以試試:

@rooms.each do |r| 
    ((r.room_rates.size+1)..7).each { 
     r.room_rates.build  
    } 
end 
+0

這似乎很好地工作......然而,這並不正確的編輯映射。如果有人只更新了一行中的一個字段,它會保存並妥善保存,但是當它重新加載時,它會顯示錯誤的位置?即使數據庫正確顯示,它也不是在星期三的專欄中顯示在星期一。它沒有這個問題,如果沒有一行中的字段是空白的。 – holden

+0

不知何故,循環必須按照他們在本週的位置排序?我不知道如何做到這一點。 – holden

+0

我想你在這裏有一些不好的設計問題。對我而言,如果您需要爲每個房間準確定位7行,那麼這看起來很糟糕。如果你在建立'room'的時候建立'room_rates',那麼它就會工作,所以當它迭代'room_rates'時,即使價格是'nil',也總會有星期一。我會將'monday_price','tuesday_price'等列添加到房間模型或單獨存儲整個星期價格的模型中。在任何情況下都會容易得多。 – klew