如何在Ruby on Rails中从Gem向现有模型添加多态关联?

时间:2016-11-27 00:17:50

标签: ruby-on-rails ruby rubygems

假设我在项目中包含了一个名为acts_as_locatable的gem,其中定义了ActsAsLocatable::Location类。我想在这个类中添加一个多态:subject关联,这可以通过简单地编辑gem中的类来添加关联来完成,如下所示:

module ActsAsLocatable

  class Location < ::ApplicationRecord

    belongs_to :subject, polymorphic: true

    ...

  end

end

但这是个坏主意,因为我不想在每次更新gem时都要保持这种变化。分叉Gem并修改fork也会遇到同样的问题。

如何在不编辑gem中的模型文件的情况下扩展,修饰或以其他方式扩充此类以添加多态:subject关联,同时保持gem的其余功能不受干扰?

1 个答案:

答案 0 :(得分:0)

在对猴子补丁进行更多研究之后,似乎有一种解决方案是添加初始化器(例如<root>/config/initializers/acts_as_locatable.rb):

ActsAsLocatable::Location.class_eval do
  belongs_to      :subject,           polymorphic: true
end

这是最好的选择吗?