2010-02-23 32 views
0

我有類似於最近的複雜形式Ryan Bates screencast鋼軌複雜的形式和訂購搭建

然而,嵌套元素工作正常。我通過一天的價格是輸入的形式創建或更新這樣的數據網格。我們的問題在他們留下一個空白時開始。我有nested_attributes_for選項不保存nils,它的工作原理,如果他們只保存一個特定的行中的值,但它保存正確的一天,但重新加載時,它會把它放在錯誤的列。我不知道如何將一行中的值排序到表單中。 IE星期三的保存值將顯示在星期一列中(正確的行)。這不會發生,如果他們保存一行的所有值(然後它完美地工作)。

的數據被存儲在DB中,像這樣

ID OBJECT_ID DAYOFWEEK PRICE和顯示像下面

+------+----------------+-------+-------+-------+------+-------+ 
| id | name   | Mon | Tue | Wed | Thu | Fri | -> +2 more days etc 
+------+----------------+-------+-------+-------+------+-------+ 
| 1234 | Some name  | 87.20 | 87.20 | 87.20 | 82.55| 85.48 | 
+------+----------------+-------+-------+-------+------+-------+ 
| 1234 | Some name  | 87.20 | 87.20 | 87.20 | 82.55| 85.48 | 
+------+----------------+-------+-------+-------+------+-------+ 
| 1234 | Some name  | 87.20 | 87.20 | 87.20 | 82.55| 85.48 | 
+------+----------------+-------+-------+-------+------+-------+ 

控制器代碼或者建築物或顯示這些值是像這樣:

控制器

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

rooms.html.erb

<% @dow = 0 %> 
    <tr class="room"> 
<td><%= f.text_field :name %></td> 

<% f.fields_for :room_rates do |rates| %> 
    <%= render 'rates', :f => rates %> 

    <% @dow += 1 %> 
<% end %> 

<td class="delete_mode" style="display:none;"> 
    <%= f.hidden_field :_destroy %> 
    <%= link_to_function "remove", "remove_room(this)" %> 
</td> 
    </tr> 

rates.html.erb
<td> 
<%= f.text_field :price, :size => 3 %> 
<%= f.hidden_field :dayofweek, :value => @dow %> 
<%= f.hidden_field :source, :value => 0 %> 
</td> 

room_rates模型(其中從形式的數據是要)

+-------+---------+-----------+-------+--------+---------------------------+---------------------------+ 
| id | room_id | dayofweek | price | source | created_at    | updated_at    | 
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+ 
| 92745 | 8  | 0   | 1.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92746 | 8  | 1   | 2.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92747 | 8  | 2   | 3.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92748 | 8  | 3   | 4.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92749 | 8  | 4   | 5.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92750 | 8  | 5   | 6.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92751 | 8  | 6   | 7.0 | 0  | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 | 
| 92752 | 9  | 3   | 5.0 | 0  | 2010-02-23 14:33:33 +0100 | 2010-02-23 14:33:33 +0100 | 
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+ 

排序在控制檯

+---------+-----------+-------+--------+---------------------------+---------------------------+ 
| room_id | dayofweek | price | source | created_at    | updated_at    | 
+---------+-----------+-------+--------+---------------------------+---------------------------+ 
| 2517 | 0   |  |  |       |       | 
| 2517 | 1   |  |  |       |       | 
| 2517 | 2   | 3.0 | 0  | 2010-02-23 17:54:28 +0100 | 2010-02-23 17:54:28 +0100 | 
| 2517 | 3   | 4.0 | 0  | 2010-02-23 17:54:28 +0100 | 2010-02-23 17:54:28 +0100 | 
| 2517 | 4   |  |  |       |       | 
| 2517 | 5   |  |  |       |       | 
| 2517 | 6   |  |  |       |       | 
+---------+-----------+-------+--------+---------------------------+---------------------------+ 
+0

和/或...我可以,如果有某種驗證可以在整行數據上執行。我怎麼能只接受一整行或根本沒有?我不確定如何使用爲每行創建的7條單獨記錄執行此操作。 – holden 2010-02-23 13:26:42

回答

2

的錯誤是當你創建表單時 - 因爲你依賴於o的順序如果房間價格正確,則需要將空房(建築)房價納入正確的位置。如果每個房間都有很多房費,則需要生成表單,以便房價在一週中的正確的一天。此代碼將建立一個新的數組,並正確設置新的數組:

@rooms.each do |r| 
    new_rates = [] 
    (0..6).each { |dow| 
    rate = r.room_rates.find_by_dayofweek(dow) 
    if rate 
     new_rates << rate 
    else 
     new_rates << r.room_rates.build(:dayofweek => dow) 
    end 
    } 
    r.room_rates = new_rates 
end 

或者,你可以只建立丟失的幾個星期,你是否爲關聯指定的順序:

// In room model 
has_many :rates, :order => "dayofweek" 

// In controller 
@rooms.each do |r| 
    (0..6).each { |dow| 
    if not r.room_rates.find_by_dayofweek(dow) 
     r.room_rates.build(:dayofweek => dow) 
    end 
    } 
end 
+0

對不起,我應該更清楚一點,記錄中沒有明顯的字段,但有多條記錄。我將費率模型添加到了我的帖子底部。但是,您添加的第二部分我認爲也可以工作。我試過類似的東西,但它仍然沒有正確地獲得表格上的順序;-( – holden 2010-02-23 14:43:29

+1

我根據問題中的附加信息編輯了我的答案。 – jamuraa 2010-02-23 15:10:51

+0

第一個看起來應該是完美的。我不確定是否有其他事情正在進行,但我會嘗試通過控制檯進行操作 – holden 2010-02-23 16:41:34