0

これに関しては、私はいつも脳痙攣を起こします。モデルのようなクラスに混在させるモジュールを作成していますが、クラスごとにシリアル化可能な属性のコピーを 1 つだけ保持する必要があります。だからここにコードがあります(それは動作しません)。

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

私が論争しているのは2つのことです:

  1. クラス変数が魔法のように存在するようにミックスインを定義する方法。と
  2. 私のClassMethodsモジュールと(より良い用語がないため)モジュールのインスタンスメソッド部分の両方でその変数にアクセスする方法。

、などがあるためValidatable、継承ではなくミックスイン手法に落ち着いたことに注意してください。また、十分にテストされ、頻繁に使用されている、あらゆる種類の検証レイヤーと永続化レイヤーが利用可能であることも知っています。これは別の獣であり、睡眠中に誰がこれを行うべきかを本当に知っておく必要がありますよね?PersistableSerializable

これを行う方法を理解するのを手伝ってくれたり、この問題にアプローチするための別の方向性を提案してくれたりする 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 に答える