[英]ActiveSupport::Concern and class methods
我正在使用ActiveSupport :: Concern来清理我的AR类中包含的一些代码。 我有一个模块来计算数据的威尔逊下限:
module CalculateWilsonBound
extend ActiveSupport::Concern
included do
class_attribute :wilson_ratings
class_attribute :wilson_positive_ratings
end
def calculate_wilson_lower_bound
number_of_ratings = self.class.wilson_ratings.call(self)
...
end
end
将其包含到对象中之后,我想提供两个类级别的方法(wilson_ratings,wilson_positive_ratings),这些方法定义了将返回各自计数的块。
从AR对象的角度来看:
class Influence < ActiveRecord::Base
include CalculateWilsonBound
wilson_ratings { |model| model.votes }
wilson_positive_ratings { |model| model.positive_votes }
这不会导致任何运行时错误,但是当我访问class属性时:
number_of_ratings = self.class.wilson_ratings.call(self)
没关系 。
首先,我是否按有意义的方式组织代码,其次,为什么class属性为nil?
我相信您将需要执行以下操作:
class Influence < ActiveRecord::Base
include CalculateWilsonBound
self.wilson_ratings = Proc.new { |model| model.votes }
self.wilson_positive_ratings = Proc.new { |model| model.positive_votes }
end
目前,您有2个问题。
尝试在类定义的上下文中分配类属性时,Rails不会意识到您正在引用该类属性,除非您使用self.
您需要分配class属性,而不是将块传递给它。 正如您的代码现在所读,看起来您正在调用一个名为wilson_ratings
的方法并将一个块传递给它。
至于您的代码是否明智,它开始让我觉得有些可笑。 我更喜欢在可能的情况下使用服务类模式(请参阅http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/)-它阻止您使用搞混class_attributes和其他可能有毛的概念。
如果要使类属性可调用,可以为其分配一个proc
self.wilson_ratings = proc{ |model| model.votes }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.