Has_one behavior - AWDWR page 332

Hi,

On AWDWR page 332 there is this example

class Order < ActiveRecord::Base
has_one :invoice
end

order = Order.new(… attributes …)
invoice = Invoice.new(… attributes …)
order.invoice = invoice

And then the explanation: If there is already an existing child object
when you assign a new object to a has_one association, that existing
object will be updated to remove its foreign key association with the
parent row(the foreign key will be set to null)

I find that however that if:

  1. I change has_one :invoice :dependent => :destroy then the existing
    object is actually DELETED rather than just FK being set to null

  2. However for the same has_one :invoice :dependent => :destroy if I
    use build_invoice instead of assignment
    i.e. order.build_invoice instead of order.invoice = invoice
    then the Existing object’s FK is NULLED out and NOT deleted.

I’m just trying to figure if:

a) Both observations above are correct
b) Why the difference in behavior - i.e. assignment DELETEs the
existing record, whereas build_association NULLs the FK

  1. :dependend => :destroy is supposed to delete it. If you don’t have
    that defined, it’ll sett the association to null

On Jan 22, 6:04 pm, Karthik N. [email protected]

  1. :dependend => :destroy is supposed to delete it. If you don’t have
    that defined, it’ll sett the association to null

Hi, you’re right however :dependent => :destroy as per the
documentation, is supposed to work when the parent is deleted. however,
in the examples above, it seems to take effect even for “normal”
association cases. And in that too, there is a discrepancy,
build_association NULLs the FK, but assignment DELETEs the child record!

puzzling …