1

通常、Railsでモデルを作成する場合は、DSLを使用して派生オブジェクトのさまざまな側面を設定します。次に例を示します。

class Question < ActiveRecord::Base
  has_one :category
  validates_presence_of :category
end

この場合、「has_one」と「validates_presence_of」は、Questionからインスタンス化されたモデルに関連付けと検証コールバックを作成します。

クラスを定義するときに使用する「親」という新しいメソッドを追加したいと思います。

class Question
  attr_accessor :category

  parent :category
end

q = Question.new
q.category = 'a category'
puts q.parent
-> 'a category'

したがって、オブジェクトをクラスからインスタンス化するときは、メソッド「親」を定義する必要があります。

どうすればよいですか?私が最初に考えたのはモジュールを使用することでしたが、これはインスタンスメソッドでもクラスメソッドでもありません。

4

1 に答える 1

2

私はこれがあなたが探しているものだと信じています:

module QuestionParent
  module ClassMethods
    def inherited(descendant)
      descendant.instance_variable_set(:@parent, parent.dup)
      super
    end

    def parent(args=nil)
      @parent ||= args
    end
  end

  module InstanceMethods
    def parent
      self.send self.class.parent.to_sym
    end
  end

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

class Question
  include QuestionParent

  attr_accessor :category

  parent :category
end

生成するもの:

q = Question.new
q.category = 'a category'
puts q.parent

a category

これは、インスタンスがシンボル(ここでは)が呼び出されたときに、クラス変数を定義parentするクラスメソッドを追加することです。@parentparentInstanceMethod@parentcategory

于 2012-11-12T19:49:57.253 に答える