【问题标题】:Rails 3 - Need shared model methods for polymorphic modelsRails 3 - 多态模型需要共享模型方法
【发布时间】:2012-06-17 07:46:30
【问题描述】:

目前我在多个模块中重复了类似这样的代码:

def do_something_polymorphic
  self.something_polymorphic_able.where(.....).each do |thing|
    ...
  end
end

本着 DRY 的精神,我尝试将 do_something_polymorphic() 移动到 /lib/shared_methods.rb 的模块中。当我在模型中添加include SharedMethods 时出现错误:

uninitialized constant Chapter::SharedMethods (NameError)

我不知道如何解决。

然后我尝试将模块文件加载到模型中(load 'shared_methods.rb')。它加载正常,但是 Module 构造脱离了命名空间,并且 do_something_polymorphic() 对于加载/包含它的模型未定义。因此,如果您尝试自引用对象,“模块”似乎不是一个选项。

最后,我从 shared_methods.rb 文件中删除了模块结构,只在文件中保留了 do_something_polymorphic() 方法。它加载正常,但是当我运行该方法时出现错误:

NoMethodError: private method `do_something_polymorphic' called for #<Polymorphic_Object:0x007fc27e5b8338>

不知道从这里去哪里。我可以返回将其设置为模块并尝试将“self”作为对象参数传递给该方法,但我想保留针对其对象干净地调用该方法的能力:current_object.do_something_polymorphic

没有走继承路线(我真的想避免),有没有一种方法可以跨多个模型共享使用 self 关键字的方法?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord shared-libraries polymorphic-associations


    【解决方案1】:

    您可以通过修改应用程序配置自动包含 lib/ 模块。

    #config/application.rb
    
    config.autoload_paths += %W(#{config.root}/lib)
    

    【讨论】:

    • 谢谢@Salil。这解决了“包括 SharedMethods”问题。这反过来又解决了另一个问题。我现在可以从所有不同的对象类型调用 do_something_polymorphic() 方法。这让一切都变得又好又干!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多