通常在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'
因此,当从类中实例化对象时,它们应该定义“父”方法。
我该怎么做?我的第一个想法是使用模块,但这不是实例方法或类方法。
答案 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
)被调用。