0

事前のお詫び-私は非常に学習者であり、学習する手段としてプロジェクトを作成しています。これでは、ActiveRecordを拡張して、次のことができるようにしようとしています...

私のモデル定義では、...を呼び出します。

attr_special :field, :field

次に、他の場所で、次のような方法でこのリストにアクセスできます

Model.special_attributes

おそらく本当に明白な何か。ActiveRecordを拡張することはできますが、これを超えるガイダンスを何を探しているのかさえわかりません(コンストラクター?)...

4

1 に答える 1

2

以下のコードのようなものを定義して、モデルにカスタムDSLを作成できます。

module SpecialAttributes
  module ClassMethods
    def attr_special(*attrs)
      class_attribute :special_attributes
      self.special_attributes = attrs
    end

    def special_attributes
      self.special_attributes
    end
  end

  module InstanceMethods
    # some code here
  end

  def self.included(base)
    base.extend ClassMethods
    base.send :include, InstanceMethods
  end

end

class ActiveRecord::Base
  include SpecialAttributes
end

Rubyでは継承よりも一般的であるため、継承を使用する代わりにActiveRecord::Baseクラスを再度開きます。

モジュールでClassMethodsとInstanceMethodsというサブモジュールを使用し、self.includedメソッドを使用してそれらを基本クラスに追加するのが好きです。したがって、インスタンスメソッドとクラスメソッドのどちらを追加するかを知らなくても、「includeMyModule」を使用できます。

私はあなたを助けることができると思います。

于 2012-04-19T22:24:53.703 に答える