2009-06-15 83 views
1

一個模塊我有這樣的:初始化混合的模式

class Bullet < ActiveRecord::Base 
    include StagedVersionMethods 
    ... 
end 

module StagedVersionMethods  
    def initialize 
    puts self.bullet_id 
    end 
end 

當我創建子彈的實例,該模塊初始化方法火災,但我得到一個ActiveRecord錯誤: ...的ActiveRecord-2.2.2/lib目錄/ active_record/attribute_methods.rb:268:在`read_attribute」

我的意圖是初始化,我需要的初步實例變量我正在混合的記錄的關鍵值。然後模塊中的其他方法將使用這個實例變量。

模塊包含()回調不適合任務,因爲在這種情況下,self是模塊而不是AR記錄。

應該如何接近?

感謝

回答

0

如果定義了初始化,如:

def initialize(*atts) 
    super(*atts) 
    puts self.bullet_id 
end 

那麼我認爲這會做你想做的,因爲它會正確地設置對象首先使用ActiveRecord的初始化。但是,我不確定這種方法對於您想要實現的功能有多強大。在訪問它時創建此實例變量可能更合適,而不是在初始化對象時。

不知道你想要實例變量做什麼,這很難說。

+0

謝謝沙德韋爾 實例變量將是實例「自我」的副本,但它所做的編輯。它代表「父母」項目符號的臨時副本,並且該模塊將在方法中混入MOdel - has_temp_version,apply_temp_version,discard_temp_version等方法。 我嘗試了你建議的方法(這非常合理),但是包括bullet_id在內的自我屬性都是零。 我現在正在使用你的第二個建議,這工作正常 - 只比我想要的多一點管道。 乾杯 – Paul 2009-06-15 16:54:02

4

在ActiveRecord上覆蓋初始化器可能會產生奇怪的副作用,難以調試,因此不推薦使用。推薦的方法是使用:ActiveRecord提供的after_initialize回調。您可以在通過一個模塊還是混合這種行爲......

module MyCleverMixin 

    def after_initialize 
    puts "I'm Initializing!" 
    end 

end 


class MyModel < ActiveRecord 

    include MyCleverMixin 

end 
+0

謝謝。事情是,我期待克拉斯是我的模型混合模塊,但克拉斯類是「班」,塊永遠不會被調用。我得到棒的錯誤結局? 非常感謝。 – Paul 2009-06-15 19:29:29