强制在rails中重新加载另一个模型的方法?

时间:2012-11-22 01:35:47

标签: ruby-on-rails ruby-on-rails-3 methods model associations

我有一个模型,它根据另一个模型表中的条目定义方法:例如文章和类型。一篇文章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模型的方法?这听起来不太可能......任何建议或指导都会很棒!

1 个答案:

答案 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