如何在 has_many 关联中再添加一个孩子并在 rails 中运行回调

Bot*_*Bot 2 activerecord ruby-on-rails ruby-on-rails-3.2

我有两种模型发票和发货。发票有_许多批货物,并且货物属于_到发票。

这就是我想要做的。

创建新货件。

new_shipment = Shipment.create! (params)
Run Code Online (Sandbox Code Playgroud)

检查此货件的合同是否已存在发票。

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
Run Code Online (Sandbox Code Playgroud)

我想知道添加发货后是否需要保存发票?此外,如何不先取货而直接添加货件?

我在发票中使用 :before_save 和 :after_save 来做一些处理。在控制台中,我尝试了这样的操作。

Invoice.last.shipments << (Shipment.first)
Invoice.last.shipments.count
Run Code Online (Sandbox Code Playgroud)

并且计数增加了。但我不确定 :before_save 和 :after_save 是否会运行,如果我明确不保存发票。

在这里,我从 excel 文件导入大数据,所以我想确保我不会两次保存发票。

yar*_*kyo 5

执行以下代码行时,将保存发票和装运之间的关联:

invoice.shipments << new_shipment
Run Code Online (Sandbox Code Playgroud)

但是,在您执行以下操作之前,不会触发 before_save 和 after_save 回调:

invoice.save
Run Code Online (Sandbox Code Playgroud)

我认为您必须先取货,然后再分配。我认为没有办法解决这个问题。