我有一个模型,它根据另一个模型表中的条目定义方法:例如文章和类型。一篇文章habtm类型,反之亦然。
我在Article.rb中定义:
Type.all.each do |type|
define_method "#{type.name}?" do
is?(:"#{type.name}")
end
end
这很棒!它允许我确保db类型中的任何类型都会导致创建关联的方法,例如:
article.type?
但是,这些方法仅在加载Article模型时运行。这引入了一些警告:例如,在Rails控制台中,如果我创建一个新的Type,它的方法是article.type_name?在reload!
一切之前不会定义。
此外,test / rspec中存在同样的问题:如果我创建了一定数量的类型,它们的关联方法还不存在。在rspec中,我不知道如何重新加载用户模型。
有人知道解决方案吗?也许,在创建新类型时,是否有某种方法可以重新加载Article模型的方法?这听起来不太可能......任何建议或指导都会很棒!
答案 0 :(得分:0)
我认为你最好避免重新加载模型并改变你的api。在Article
中,您是否真的反对通过更通用的方法进行单一访问?
def type?(type)
return is? type if type.is_a? String # for when type is the Type name already
is? type.name # for when an instance of Type is passed
end
如果您为每种类型设置了单独的方法,那么这样的内容可能适用于您的Type
类
after_insert do
block = eval <<-END.gsub(/^ {6}/, '')
Proc.new { is? :#{self.name} }
END
Article.send(:define_method, "#{self.name}?", block)
end