2016-07-22 69 views
0

我有幾個類被序列化到一個文件與YAML。爲了序列化時,它的屬性變化,我已經實現自定義的制定者爲他們每個人:添加方法調用setter(序列化)

def serialize 
    File.open(@inipath, 'w') do |file| 
    file << YAML.dump(self) 
    end 
end 

def numbering=(value) 
    @numbering = value 
    serialize 
end 

def savepath=(value) 
    @savepath = value 
    serialize 
end 

def active=(value) 
    @active = value 
    serialize 
end 

... 

可這不重複做什麼?

回答

3

我可能會在這裏使用一些元編程祕密醬。

這裏的醬:

module OptInSerialization 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 
    def serialize_on_changes_in(*names) 
     names.each do |name| 
     alias_method "old_#{name}=", "#{name}=" 

     define_method "#{name}=" do |val| 
      send("old_#{name}=", val) 
      serialize 
     end 
     end 
    end 
    end 
end 

這裏是你如何使用它:

​​

注意的是,這裏的序列不被分配給there觸發,因爲你沒有指定。

聲明:此MP魔法可能會超出您當前的級別,所以如果您不理解它,請不要使用它。

0

這裏ClassName是模型的名稱,column_names會給你模型的所有列。

ClassName.column_names.each do |type| 
    define_method("#{type}=(value)") do 
     eval"@#{type}" 
     instance_variable_set("@#{type}",value) 
     serialize 
    end 


def column_names 
    ['numbering','savepath'] 
end 
+0

我不使用Rails,而是一個純ruby類。 – Sven

+0

您可以創建一個方法column_names,它將返回所需的任何setter。 –