Ruby on rails 重写ActiveRecord::Base

Ruby on rails 重写ActiveRecord::Base,ruby-on-rails,Ruby On Rails,我的一些模型有一个“company_id”列,我想自动设置。所以我想重写activerecord库中的一些方法 我在config/initializers中尝试了这一点,但不起作用: class ActiveRecord::Base after_initialize :init def init if (self.respond_to(:company_id)) self.company_id= UserSession.find.user.company_id

我的一些模型有一个“company_id”列,我想自动设置。所以我想重写activerecord库中的一些方法

我在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
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
最佳实践建议不要在模型中设置与会话相关的字段。使用控制器进行此操作。

这里有两个问题。首先,您正在向所有ActiveRecord模型中注入大量内容,而最好只向相关模型中添加该功能

其次,您正在打破MVC模式,试图将会话上下文注入到模型中


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

代码仍然假装您有权访问模型内的UserSession,这是不正确的。您不需要这样做,特别是如果您不在请求的范围内(例如worker、mailer或CLI)。