1

我有一个模型,它根据另一个模型表中的条目定义方法:例如文章和类型。一篇文章 habtm 类型,反之亦然。

我在 Article.rb 中定义:

 Type.all.each do |type|
   define_method "#{type.name}?" do
     is?(:"#{type.name}")
   end
 end

这很好用!它允许我确保类型 db 中的任何类型都会导致创建关联的方法,例如:

 article.type?

但是,这些方法仅在您加载 Article 模型时运行。这引入了一些警告:例如,在 Rails 控制台中,如果我创建一个新类型,它的方法 article.type_name? reload!直到我一切都不会被定义。

此外,test/rspec 中也存在同样的问题:如果我创建了一定数量的类型,它们的关联方法将不存在。在 rspec 中,我不知道如何重新加载 User 模型。

有谁知道这里的解决方案?也许,有什么方法可以在创建新类型时重新加载 Article 模型的方法?这听起来不太可能......任何建议或指导都会很棒!

4

1 回答 1

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
于 2012-11-22T01:45:58.477 回答