使用activerecord时,我注意到在构造关联时,只有在已经保存了倒数模型时才会自动提供倒数关联。如果尚未保存,则必须手动定义此互惠关联。我想知道这是故意还是错误,因为它工作或失败的唯一区别是互惠模型是否已被保存。
我希望用以下要点中描述的三种情景来澄清这一点。
我希望方案1可以在没有方案3中显示的额外分配步骤的情况下工作。它没有。
答案 0 :(得分:3)
原因很简单 - 当您通过尚未保存父对象的关联创建对象时,其关联的外键不能具有值,因为尚未保存关联的记录。通过例子:
# Registration announcement is not saved at this point, so it has no ID.
@a1 = @e1.build_registration_announcement(:announcement => "Please bring a favorite baked dish.")
# Registration is built without a registration_announcement_id, as @a1 has no ID to pass on.
@a1.registrations.build(:contact_email => "jdoe@yahoo.com", :adults => 1)
#registration doesn't know about its unsaved registration_announcement parent
# Registration announcement is created and saved. ID exists.
@a2 = @e2.create_registration_announcement(:announcement => "Fall house cleaning!")
# Since the Registration announcement has an ID, registration_announcement_id is set on the built associated registration
@a2.registrations.build(:contact_email => "tara.smith@yahoo.com", :adults => 5)
#registration knows about its saved registration_announcement parent
这有点出乎意料,因为您可能逻辑上期望Rails保持对象关联,然后在保存时分配关联外键,但它似乎不会那样工作。