在Ruby中定义类方法

时间:2012-11-12 19:35:17

标签: ruby ruby-on-rails-3

通常在Rails中编写模型时,您可以使用DSL来设置派生对象的各个方面,例如:

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

在这种情况下,“has_one”和“validates_presence_of”会在从Question中实例化的模型上创建关联和验证回调。

我想添加一个名为“parent”的新方法,以便在定义类时使用:

class Question
  attr_accessor :category

  parent :category
end

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

因此,当从类中实例化对象时,它们应该定义“父”方法。

我该怎么做?我的第一个想法是使用模块,但这不是实例方法或类方法。

1 个答案:

答案 0 :(得分: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 @parent中的parent时,它会添加一个类方法InstanceMethod来定义类变量@parent。 } symbol(此处为category)被调用。