为各种模型添加范围

时间:2015-01-28 08:29:17

标签: ruby-on-rails ruby-on-rails-4

在apps / models / concerns / deactivable.rb

module Deactivatable
  extend ActiveSupport::Concern

  included do
    scope :alive, -> { where(:deactivated_at => nil) }
  end

  def deactivate(t = Time.current)
    update_attribute(:deactivated_at,t)
  end

  def activate
    update_attribute(:deactivated_at,nil)
  end

  def deactivated?
    deactivated_at.present?
  end

end

这包含在2个模型中,app / models / activity_rules / activity_detection_rule.rb和app / models / concerns / generic_campaign.rb。

还有另外两个模型包含具有不同属性名称的相同方法。

在redeemable.rb中,

class Redeemable < ActiveRecord::Base
  scope :alive, -> { where("(deactivation_date is null) and (expiry_date is null or expiry_date >= ?)",Date.today) }

  def deactivate(t = Time.current)
    update_attribute(:deactivation_date,t)
  end

  def reactivate
    update_attribute(:deactivation_date,nil)
  end

  def deactivated?
    deactivation_date.present?
  end
end

并在surprise_set.rb

scope :alive, -> { where("deactivation_date is null") }

使用与redeemable.rb相同的3种方法。

如何使用可停用的关注来干掉其他两个模型?

1 个答案:

答案 0 :(得分:2)

您可以从类方法返回指示停用时间的属性。如果需要,您可以在关注中提供默认实现,并在包含关注的类中覆盖:

module Deactivatable
  extend ActiveSupport::Concern

  included do
    scope :alive, -> { where(deactive_attr => nil) }

    def self.deactive_attr
      :deactivated_at
    end
  end

  def deactivate(t = Time.current)
    update_attribute(self.class.deactive_attr, t)
  end

  def activate
    update_attribute(self.class.deactive_attr, nil)
  end

  def deactivated?
    self.send(self.class.deactive_attr).present?
  end

end

然后,在要提供不同属性的类中,可以添加类方法:

include Deactivatable

def self.deactive_attr
  :deactivation_date
end

您还可以通过允许包含关注点的类来定义“活力”的条件来稍微干掉您的alive范围。在此问题中,您可以定义默认

scope :alive, -> { where(self.active_conditions) }

def self.active_conditions
  { self.deactive_attr => nil }
end

然后,您可以在类本身中提供active_conditions的不同实现:

self self.active_conditions
  ["(deactivation_date is null) and 
   (expiry_date is null or expiry_date >= ?)", Date.today]
end