我的一些模特有一个" 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
我还能做些什么吗?
最佳做法是不要在模型中设置与会话相关的字段。使用控制器。
答案 0 :(得分:4)
这里有两个问题。首先,你要在所有ActiveRecord模型中注入一堆东西,而最好只将功能添加到相关模型中。
第二,你打破MVC模式试图将会话上下文注入模型。
您应该做的是在模块中编写功能,并仅在相关模型中混合模块。根据上下文,不是覆盖默认AR行为,而是添加一个新方法,在该方法中传递当前会话上下文(依赖注入)并返回使用所需公司初始化的模型,当会话设置正确且模型为公司时 - 察觉。