覆盖ActiveRecord :: Base

时间:2015-01-29 09:57:57

标签: ruby-on-rails

我的一些模特有一个" company_id"列,我想自动设置。所以我想在activerecord base中覆盖一些方法。

我在config / initializers中试过这个,但是不起作用:

class ActiveRecord::Base
  after_initialize :init

  def init
    if (self.respond_to(:company_id))
      self.company_id= UserSession.find.user.company_id
    end
  end
end
<3> Simone Carletti回答后的解决方案:

我创建了一个模块:

module WithCompany  
  def initialize_company
    self.company_id= UserSession.find.user.company_id
  end
end

并将其包含在模型中:

class Exam < ActiveRecord::Base
  include WithCompany

  after_initialize :init

  def init
    initialize_company
  end
end

我还能做些什么吗?

更新2

最佳做法是不要在模型中设置与会话相关的字段。使用控制器。

1 个答案:

答案 0 :(得分:4)

这里有两个问题。首先,你要在所有ActiveRecord模型中注入一堆东西,而最好只将功能添加到相关模型中。

第二,你打破MVC模式试图将会话上下文注入模型。

您应该做的是在模块中编写功能,并仅在相关模型中混合模块。根据上下文,不是覆盖默认AR行为,而是添加一个新方法,在该方法中传递当前会话上下文(依赖注入)并返回使用所需公司初始化的模型,当会话设置正确且模型为公司时 - 察觉。