2012-11-22 42 views
1

我有一個模型,基於另一個模型的表中的條目定義方法:例如文章和類型。一篇文章habtm類型,反之亦然。強制在軌中重新加載另一個模型的方法?

我定義Article.rb:

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

這個偉大的工程!它可以讓我以確保正在創建DB型結果相關聯的方法的任何類型,如:

article.type? 

但是,當您加載條模型,這些方法只是運行。這引入了一些警告:例如,在Rails控制檯中,如果我創建一個新的Type,它的方法article.type_name?直到我reload!一切都不會被定義。

此外,test/rspec中存在同樣的問題:如果我創建了一定數量的類型,它們的關聯方法將不存在。而在rspec中,我不知道如何重新加載User模型。

有沒有人知道這裏的解決方案?也許,在創建一個新類型時,有什麼方法可以重新加載Article模型的方法?這聽起來不太可能..任何建議或指導將是偉大的!

回答

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 
+0

是的工作,我可以看到爲什麼這是更好的。但是,我正在開發一個預先存在的系統,其中一些取決於article.type_name?如果不可能,我可能會放棄這一點。 – jay

+0

幾分鐘後,我會更新我的答案;我正在研究'after_insert'塊,您可以添加到'Type'來調用'Article' – deefour

+0

cool的'define_method'。只是一個想法:after_insert?或after_commit,哪一個會更可靠? – jay