预订模型中的额外费用列不会在创建新预订时计算和保存。编辑预约时会对其进行计算和保存(即使不更改表单中的任何值)。似乎计算方法或其他东西没有收到复选框值。
Reservation has_many :bookings, has_many :extras, :through => :bookings
Booking belongs_to :extra, belongs_to :reservation
Extra has_many :bookings, has_many :reservations, :through => :bookings
before_save :calculate_extras_cost
def calculate_extras_cost
self.extras_cost = self.extras.sum(:daily_rate) * total_days
end
<%=hidden_field_tag "reservation[extra_ids][]", nil %>
<%Extra.all.each do |extra|%>
<%= check_box_tag "reservation[extra_ids][]", extra.id, @reservation.extra_ids.include?(extra.id), id: dom_id(extra)%>
<% end %>
答案 0 :(得分:1)
使用form collection helpers代替手动创建输入:
<%= form_for(@reservation) do |f| %>
<%= f.collection_check_boxes(:extra_ids, Extra.all, :id, :name) %>
<% end %>
另外,请确保将:extra_ids
属性列入白名单。
使用回调时要记住的另一件事是父记录必须在子记录之前插入到数据库中!这意味着您不能在回调中使用self.extras.sum(:daily_rate)
,因为它依赖于数据库中的子记录。
您可以使用self.extras.map(&:daily_rate).sum
从Ruby中的内存中对相关模型的值求和。另一种选择是使用association callbacks。