2013-08-19 30 views
1

我有兩個模型發票和裝運。發票has_many貨件並且貨件屬於發票。如何添加一個孩子到has_many關聯並在rails中運行回調

這是我想要做的。

創建新的貨件。

new_shipment = Shipment.create! (params) 

檢查此貨件合同是否已存在發票。

invoice = Invoice.find_by_ref_no(ref_no) 

if invoice.nil? 
    invoice.shipments << new_shipment 
    invoice.save 
else 
    Invoice.create! (some_params, 
        :shipment_ids => [new_shipment.id], 
        other_params 
        ) 
end 

我想知道是否需要在添加裝運後保存發票? 進一步如何直接添加貨件而不先取貨?

我使用:before_save和after_save在發票中做一些處理。在控制檯我嘗試了這樣的事情。

Invoice.last.shipments << (Shipment.first) 
Invoice.last.shipments.count 

而且數量增加了。但我不確定:before_save和after_save是否會運行,如果我明確不保存發票。

在這裏,我從Excel文件導入大數據,所以我想確保我不保存發票兩次。

+0

'invoice.shipments.create!(PARAMS_FOR_SHIPMENT)'...可能你想要這個...謝謝 –

+0

我沒有該發票的所有現有貨件。這是剛剛創建的新貨物,需要將其添加到現有發票(不創建新發票)。 – Bot

+0

不,你不需要所有的貨物來創建貨件 –

回答

3

,當你做這行的代碼,發票和運輸之間的關聯保存:

invoice.shipments << new_shipment 

但是你before_save和after_save的回調將不會被觸發,直到你做的事:

invoice.save 

我認爲您必須在分配貨物之前先取貨。我不認爲有任何解決辦法。

+0

你能告訴我更多關於孩子爲什麼關聯的信息,但回調不會運行,或者提供一些參考資料來找出答案。 – Bot

+0

集合<<(object,...) 通過在連接表中創建關聯(collection.push和collection.concat是此方法的別名)來向集合添加一個或多個對象。請注意,除非父對象是新記錄,否則此操作會立即觸發update sql,而不會等待父對象的保存或更新調用。 – yarakyo

+0

謝謝。順便說一句有沒有辦法避免這種SQL更新,只有一個保存查詢添加子,然後只保存一個查詢? – Bot

0

,同時創造你的貨,你可以做,

@new_shipment = invoice.shipments.new 
@new_shipment.save 

,這將貨物關聯到發票。

+0

感謝您的答覆。這似乎是一種好方法,但在我的情況下,裝運始終在創建時始終進行開票並不是必需的。根據某些條件,我可能會或可能不想將它與發票關聯起來。 – Bot

相關問題