1

通常在 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'

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

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

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将定义类变量的类方法@parent,当实例调用符号(这里是)时调用。parentInstanceMethod@parentcategory

于 2012-11-12T19:49:57.253 回答