Рубиновый комплекс проверки - PullRequest
0 голосов
/ 07 мая 2010

Имейте продукт, который принадлежит категории. Хотите создать рекламную акцию за короткий период времени (скажем, неделю или две), но в течение этого времени их может быть только одна рекламная акция на категорию.

Как я могу создать пользовательскую проверку для этого?

product class
  belongs_to :categories

  name:string
  desc:text  
  reg_price:decimal  
  category_id:integer  
  promo_active:boolean  
  promo_price:decimal  
  promo_start:datetime  
  promo_end:datetime
end

category class
  has_many :products

  name:string
end

Обновление до возможного решения ???

    class Product < ActiveRecord::Base
  attr_accessible :name, :desc, :reg_price, :category_id, :promo_active, :promo_price, :promo_start, :promo_end

  belongs_to  :category

  #validate :check_unique_promo
  #Tweaked original to be more exact and 
  #Give clue if its the start or end date with the error.
  validate :check_unique_promo_start
  validate :check_unique_promo_end

def check_unique_promo
  errors.add_to_base("Only 1 promo allowed") unless Product.count(:conditions => ["promo_active = ? AND promo_end < ?", true, self.promo_start]) == 0
end  

def check_unique_promo_start
  errors.add_to_base("Start date overlaps with another promotion.") unless self.promo_active == false || Product.count(:conditions => ['promo_end BETWEEN ? AND ? AND category_id = ? AND promo_active = ? AND id != ?',self.promo_start, self.promo_end, self.category_id, true, self.id]) == 0
end

def check_unique_promo_end
   errors.add_to_base("End date overlaps with another promotion.") unless self.promo_active == false || Product.count(:conditions => ['promo_start BETWEEN ? AND ? AND category_id = ? AND promo_active = ? AND id != ?',self.promo_start, self.promo_end, self.category_id, true, self.id]) == 0
end
end

Я пропускаю себя, если promo_active false для производительности.

1 Ответ

1 голос
/ 07 мая 2010

Я бы использовал проверку validates_uniqueness_of так:

class Product < ActiveRecord::Base
  belongs_to :categories
  validates_uniqueness_of :promo_active, :scope => :category_id, :allow_nil => true

  before_save :update_promos

  private
  def update_promos
    # custom code to set :promo_active to nil if the promo is 
    # not active and to something else if it is active
  end
end

Взять 2:

validate :check_unique_promo

def check_unique_promo
  errors.add_to_base("Only 1 promo allowed") unless Product.count(:conditions => ["active_promo = 1 AND promo_end < ?", self.promo_start]) == 0
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...