2009-11-19 68 views
1

有沒有寫這個代碼的一個更好的辦法?它只是不跟我坐的權利,我覺得有一些真正「像Rails的,我應該已經知道:Rails的:通過belongs_to的保存記錄和設置外鍵

belongs_to :parent_in_use 
belongs_to :parent_template 

def after_create 
    new_parent_in_use = ParentInUse.create!(self.parent_template.attributes) 
    self.update_attribute(:parent_in_use_id, new_parent_in_use.id) 
end 

創造了記錄後,我採取了所選父模板和創建parent_in_use記錄基於它。這樣模板可以改變,in_use記錄將永遠與我的對象一起生活。 ParentInUse和ParentTemplate類都使用STI從Parent繼承。

我敢肯定這應該是很簡單,但我不知道怎麼做了,基本上我想創建並在一次操作中分配的記錄。

回答

0

這將做你在找什麼。

def after_create 
    self.parent_in_use = ParentInUse.create!(parent_template.attributes) 
end 

但是如果沒有其他改變,它不會對你有任何好處。由於外鍵存儲在當前模型中,如果這種關聯是通過after_create調用創建回的ActiveRecord不會保存更改。新的ParentInUse對象將被保存,但當前模型的數據庫行不會使用相應的parent_in_use_id進行更新。

把它作爲一個before_create回調,事情會更加順利。

+0

我想成爲100%確信current_model創建相應的記錄之前就已經存在。如果模型無效,我認爲它不會進入before_create回調? – tsdbrown 2009-11-19 17:51:18

+1

這是一個有效的假設。同樣,所有的回調函數都被封裝在單個事務中,如果它們中的任何一個返回false或者引發錯誤,則整個事務被回滾。因此,除非一路上的所有內容成功,否則不會創建ParentInUse。 – EmFi 2009-11-19 18:01:05

相關問題