Ruby on rails 如何在rails中向多个关联添加一个子项并运行回调

Ruby on rails 如何在rails中向多个关联添加一个子项并运行回调,ruby-on-rails,activerecord,ruby-on-rails-3.2,Ruby On Rails,Activerecord,Ruby On Rails 3.2,我有两种型号的发票和发货单。发票包含多个装运,装运属于发票 这就是我要做的 创建新装运 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,

我有两种型号的发票和发货单。发票包含多个装运,装运属于发票

这就是我要做的

创建新装运

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
检查此装运合同的发票是否已存在

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
invoice=发票。按参考号(参考号)查找
如果发票是零?
invoice.Shippings[新装运.id],
其他参数
)
结束
我想知道添加装运后是否需要保存发票? 此外,我如何在不先提取的情况下直接添加装运

我使用:before_save和:after_save in Invoice做一些处理。在控制台中,我尝试了类似的方法

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

Invoice.last.shippings您可以在创建装运时执行以下操作:

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

,这将发货与发票关联

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

invoice.shipments << new_shipment

我想你必须在分配货物之前先把它取出来。我不认为有任何办法可以解决这个问题

invoice.shippings.create!(用于装运的参数)
…可能是您想要这个…谢谢我没有该发票的所有现有装运。这是刚创建的新装运,需要添加到现有发票(而不是创建新发票)。不,您不需要所有装运才能创建装运感谢您的回复。这似乎是一个很好的方法,但在我的情况下,没有必要在创建装运时始终为装运开具发票。根据某些条件,我可能希望也可能不希望将其与发票关联。您能否告诉我更多有关为什么会关联child,但不会运行回拨或提供一些参考来了解。Collection谢谢。顺便说一句,有没有办法避免这种sql更新,只使用一个保存查询来添加子项,然后只使用一个查询来保存它?@Bot,即使使用普通sql,这也是不可能的。您必须先获取新记录的id,然后才能进行关联。对此,您始终需要两个查询。我现在明白了!:)谢谢你们两位。那么我想我现在的状态很好。