【问题标题】:rails build method for complex model with days of the week带有星期几的复杂模型的rails构建方法
【发布时间】:2010-02-22 12:10:18
【问题描述】:

我有一组嵌套模型用于存储各个房间的价格。

即。

  Places
    Rooms
      Room_rates

每个模型都有必要的 accept_nested_attributes_for 和 has_many belongs_to 关联,我有一个表单和一个构建方法,非常适合初始创建。

我的问题是如何制作一个更智能的控制器,如果它不存在则构建该字段,或者如果存在则从它读取(并且不构建它)。目前它仅适用于初始输入,否则它会尝试构建比可能更多的字段并在重新提交时中断。

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

【问题讨论】:

    标签: ruby-on-rails forms activerecord nested-forms fields-for


    【解决方案1】:

    你可以试试:

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

    【讨论】:

    • 这似乎运作良好......但这并不能在编辑时正确映射它们。如果有人只更新行中的一个字段,它会正确保存并保存它,但是当它重新加载时,它会显示在不正确的位置?即使数据库正确显示它,它也不会出现在星期三的列中,而是显示在星期一的字段中。如果一行中没有一个字段是空白的,则不会出现此问题。
    • 不知何故,循环必须按他们在一周中的位置对它们进行排序?我不知道该怎么做。
    • 我认为你有一些糟糕的设计问题。对我来说,如果您需要正好有 7 排每个房间的价格,这看起来很糟糕。如果你在构建room 时构建room_rates,它会起作用,所以当它迭代room_rates 时,即使价格是nil,也总会有星期一。我会将monday_pricetuesday_price 等列添加到房间模型或存储整周价格的单独模型中。在任何情况下都会容易得多。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多