繁体   English   中英

ActiveSupport ::关注和类方法

[英]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个问题。

  1. 尝试在类定义的上下文中分配类属性时,Rails不会意识到您正在引用该类属性,除非您使用self.

  2. 您需要分配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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM