2014-03-12 49 views
0

我想在任何時候創建一個父對象的實例時創建一個子對象。在Rails ActiveRecord模型中創建父項時創建子對象的最佳做法是什麼?

因此調用Parent.new()會自動生成一個與父對象關聯的子對象。我重寫初始化(如下),但有沒有更好的方法?我需要將其中一個參數傳遞給子對象,但我不想使用嵌套屬性。這是針對API的,對於API用戶來說,分割應該是不可見的。

has_one :child 
validates_associated :child 

def initializer(args*) 
    @child = Child.new(args[:some_argument]) 
    super 
end 
+0

以外,我不認爲鐵軌上有任何OFTB,因爲這個問題是開放式的,所以不一定有一個正確答案。因此,我正在將我認爲最有用的一個標記爲正確。 – Simmo

回答

2

我想這就是爲什麼ActiveRecord的有像回調:after_createafter_save

對於什麼是值得我認識了一個叫施普雷其中有產品和主變型(子模式:變)著名的開源項目作爲一個Product對象依賴。

下面的代碼:https://github.com/spree/spree/blob/master/core/app/models/spree/product.rb#L236-L250

和:https://github.com/spree/spree/blob/master/core/app/models/spree/product.rb#L87

你可以有一個after_create救子對象的數據。

而且,在我看來。你不應該重寫初始化模型。您最終可能會遇到循環依賴問題或稍後發生的一些隨機錯誤。只是說..

1

另一種選擇可能會使用after_initialize回調:

after_initialize -> { child = Child.new(child_attributes) }

這意味着你必須也設置爲attr_accessor父對象:

class Parent 
    attr_accessor :child_attributes 
end 

這是隻是一種不同的方法,對我來說並不好看。除了nested_attributes

相關問題