Ruby on rails 重写ActiveRecord::Base
我的一些模型有一个“company_id”列,我想自动设置。所以我想重写activerecord库中的一些方法 我在config/initializers中尝试了这一点,但不起作用: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
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)。