рельсы сложной формы и упорядочения со сборкой - PullRequest
0 голосов
/ 23 февраля 2010

У меня сложная форма, похожая на недавнюю скринкаст Райана Бейтса

Однако вложенные элементы работают нормально. Я создаю или обновляю сетку данных, таких как эта, через форму, в которой указаны цены за день. Моя проблема начинается, когда они оставляют один бланк. У меня есть опция nested_attributes_for для того, чтобы не сохранять nils, и она работает, если они сохраняют только одно значение в определенной строке, он сохраняет правильный день, однако при перезагрузке помещает его в неправильный столбец. Я не уверен, как упорядочить значения в строке в форме. IE Сохраненное значение для среды появится в столбце понедельника (правильной строки). Этого не происходит, если они сохраняют все значения для строки (тогда это работает отлично).

Данные хранятся в БД примерно так

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         |       |        |                           |                           |
+---------+-----------+-------+--------+---------------------------+---------------------------+

1 Ответ

2 голосов
/ 23 февраля 2010

Ошибка заключается в том, что вы создаете форму - поскольку вы зависите от правильности порядка room_rate, вам нужно поместить пустые (построенные) ставки в правильные позиции. Если в каждом номере много номеров, вам нужно сгенерировать форму, чтобы цены соответствовали нужному дню недели. Этот код создаст его в новом массиве и правильно установит новый массив:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...