在rails模型中重新定义gem方法不起作用

时间:2014-02-27 18:53:15

标签: ruby-on-rails ruby activerecord gem

所以我有一个包含一些activerecord模型的gem,它们被我们平台上的多个应用程序使用。我们有一个常量定义了一个“类型”列表,这些列表在几个不同的应用程序上有所不同。

# in the gem
class MyModel < ActiveRecord::Base
  TYPES = ["A Type", "Another Type"]
end

在应用程序代码中重新定义此常量将为已经初始化的常量生成警告。因为它并不是真的不变,所以我决定将它重构为类方法。

# gem
class MyModel < ActiveRecord::Base
  def self.types
    []
  end
end

# application a
class MyModel < ActiveRecord::Base
  def self.types
    ["A Type", "D Type"]
  end
end

# application b
class MyModel < ActiveRecord::Base
  def self.types
    ["B Type", "C Type"]
  end    
end

但是,在App A或B中访问MyModel.types时,类型为[]。这个以及其他一些问题让我得出结论,在加载rails应用程序之后加载了gem,而我的假设恰恰相反。

处理这种不同情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

在您的应用程序中执行此操作

config/initializers/中创建一个文件,并在您的两个应用中添加此代码

MyModel.instance_eval do
  def types
    ["A Type", "D Type"]
  end
end

MyModel.class_eval do
  def self.types
    ["A Type", "D Type"]
  end
end

答案 1 :(得分:0)

您必须从引擎中明确要求初始类,这将确保它已加载。 在开发中有时不是这种情况(例如autoload

require YourEngine::Engine.root.join('app/models/your_namespace/my_model')

class MyModel  #no inheritance here, we just reopen an existing class, right?
   def self.types
     [] #override it as you like
   end
end