0

说到这个,我总是脑抽筋。我正在创建一个模块来混合到类似模型的类中,但它需要为每个类保留一份可序列化属性的副本。所以这是代码(不起作用)。

module Checkin
  module Model
    def self.included(base)
      base.extend(ClassMethods)
    end

    @@serialiable_attrs = []   <== really not the right place
    module ClassMethods
      def serializable(*attrs)
        attrs.each{|attr| @@serializable_attrs << attr} # Is this @@ or just @?
      end
    end

    def serialize!
      @@serializable_attrs.each{|a| do_something_with(a)} # <== Will this work?
    end
  end
end

class Person  
  include Checkin::Model
  serializable :first_name, :original_name, :last_name, :checked_in, :people_attending
  # etc., etc.
end

我纠结的是两件事:

  1. 如何定义我的混入,使类变量神奇地出现;和
  2. 如何在我的ClassMethods模块和模块的(因为没有更好的术语)实例方法部分中访问该变量。

请注意,我选择了一种混合技术而不是继承,因为我将拥有Validatable,Persistable等等Serializable。此外,我知道有各种可用的验证和持久层,它们经过了良好的测试和大量使用。这是一个不同的野兽,我真的应该知道谁在我的睡眠中这样做,对吧?

任何可以帮助我理解如何执行此操作或建议解决此问题的不同方向的 Ruby 向导,我感谢您的帮助!

4

1 回答 1

1

尝试删除类变量,并将其添加到模块中ClassMethod

def self.extended(klass)
  klass.instance_variable_set("@serializable_attrs", [])
end

并将双输入更改@为单输入serializable。并更改serialize!为:

self.class.instance_variable_get("@serializable_attrs").each{|a| do_something_with(a)}
于 2012-07-30T23:46:01.243 回答