我有一个User模型,它具有许多其他属性(如设置和一些日志信息),这些属性仅在某些情况下需要并且包含大量数据。
如果我自己从数据库中选择一个用户,那么在大多数情况下我会使用这样的东西(我不需要那些额外的吸引力);
standard_attrs = [:id, :username]
User.select(standard_attrs).find(params[:user_id])
(这只是一个示例案例,standard_attrs
将包含的不仅仅是那些attrs,而不是整套用户attrs。)
使用devise,它在加载current_user对象时从用户中选择*。有没有办法在加载current_user时更改设计选择的内容?或者更好的解决方案是将不太常用的激光器移动到单独的模型上?
由于
答案 0 :(得分:1)
我会将附加数据移动到单独的模型中,你可以使用draper gem,因为它显然是Decorator模式。
在以下链接中: http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
看看第7步:
"对于回调逻辑只需要在某些情况下运行或在模型中包含回调逻辑会给模型带来太多责任的情况,装饰器很有用。"
所以你有一些逻辑(获得某些用户的额外数据)。由于此数据位于数据库中,因此该模型也应保留在数据库中。
恕我直言装饰师是要走的路。你实际上并不需要布料,你可以用PORO(普通的旧红宝石对象)做到这一点。
底线,创建另一个具有用户ID的模型,在用户中创建用于运行查询的函数以获取此数据:
def additional_attributes
AdditionaAttributes.find(self.id)
end
并使用它。由于您有一些逻辑来决定何时调用它,因此您不会遇到任何问题。
注意:我使用了术语装饰器,因为它是最接近的描述。像从ActiveModel扩展的PORO那样实现它,你很高兴。