2012-06-21 49 views
0

假設我們以下類正確屬性初始化時的屬性由另一類包裹

class Foo < ActiveRecord::Base 
    attr_accessible :name, :bars, :bazs 

    def bars=(bars) 
    baz = [] 
    bars.each { |b| barz << Baz.new(bar:b, magic_number: 123) } 
    end 

    def bars 
    bazs.map(&:bar) 
    end 
end 

class Bar < ActiveRecord::Base 
    attr_accesible :name 
end 

class Baz < ActiveRecord::Base 
    attr_accesible :magic_number, :bar 
    has_one :bar 
end 

這是「軌道」的方式來聲明一個初始化方法,以便當從散列創建一個Foo已bazs被初始化。例如

Foo.new(name:"foo", bars:[Bar.new(name:"b1"), Bar.new(name:"b2")]) 

不能使用after_initialize因爲self[:bars]收益爲零。另一個選項是覆蓋initialize方法,但它不是由Rails文檔推薦的,我不能使用barz=,因爲初始化後barz返回nil,我不得不使用self[:barz]=。另一種選擇是聲明一個類構造方法,通過調用setter來進行正確的初始化,但它似乎不是Ruby方式(Foo.from(name:"foo", bars:[Bar.new(name:"b1"), Bar.new(name:"b2")]))。

感謝

+0

它是'attr_accessible:name,:bars,:barz','barz = []'和'bars.each {| b | barz << Baz.new(bar:b,magic_number:123)}'? –

回答

0

OK我終於做了申報一切,attr_accessible並重寫initialize方法

class Foo < ActiveRecord::Base 
    attr_accessible :name, :bars, :bazs 

    def initialize(attributes = nil, options = {}) 
    super 
    self.bars = attributes[:bars] 
    end 

    def bars=(bars) 
    self.bazs = [] 
    self.bars.each { |b| self.bazs << Baz.new(bar:b, magic_number: 123) } 
    end 

    def bars 
    self.bazs.map(&:bar) 
    end 

end 

有一點要注意,我不知道的是,每次我需要叫它需要使用self.