2016-05-14 62 views
0

預留模型中的額外費用列在創建新預留時未計算並保存。在編輯預約時即使沒有更改表格中的任何值,它也會被計算並保存。看起來checkboxes的值沒有被計算方法或其他東西接收到。導軌計算值不適用於複選框

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

回答

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

+0

感謝您獲取表單收集助手和關聯回調的提示。您的解決方案完美地工作,這是我改變的唯一一點。 self.extras.map(&:daily_rate).sum –