2011-11-06 64 views
0

我有三個型號:我該如何寫這個活動記錄? (Rails的3.1)

  • raw_coupon
  • 優惠券

如果我通過循環raw_coupons,我怎樣才能將其保存爲僅在優惠券該商店不存在相同的coupon_code?這裏是代碼,使之更加清晰:

raw_coupon.each do |raw_coupon| 
    coupon = Coupon.new 
    coupon.store_id = raw_coupon.store_id 
    coupon.coupon_code = raw_coupon.coupon_code 

    coupon.save if [coupon_code for this store doesn't already exist] 
end 

我如何寫出來的[COUPON_CODE此店不存在]

注:超過一個店可以使用相同的優惠券代碼,因此我需要檢查該商店是否存在相同的coupon_code。

編輯:這裏是模型關聯:

  • raw_coupon:HAS_ONE:優惠券
  • 優惠券:belongs_to的:raw_coupon & & belongs_to的:店面
  • 店:的has_many:優惠券

回答

1

只需向Coupon添加獨特的驗證碼,並在撥打0123時留意錯誤:

class Coupon < ActiveRecord::Base 
    validates :coupon_code, :uniqueness => { :scope => :store_id } 
    #... 
end 

The :scope limits唯一性檢查爲優惠券的store_id的優惠券代碼。

您還應該在store_idcoupon_code上添加coupons的唯一索引作爲額外的保護層。

+0

那麼nil呢?商店可以在coupon_code爲零的系統中擁有多個優惠券。 – Hopstream

+0

@Hopstream:沒有代碼的優惠券?聽起來很奇怪,但是對於這個選項有[':allow_nil'](http://guides.rubyonrails.org/active_record_validations_callbacks.html#allow_nil)選項,並且在唯一索引中允許有多個NULL。 –

+0

有沒有一種方法可以在條件中做到這一點(因爲否則使用驗證,它總是會引發錯誤) - 並且處理數千個這樣的優惠券將導致數千個錯誤。 – Hopstream

0

您可以使用find_or_initialize_by幫助程序。我不會推薦find_or_create_by helper,因爲如果在創建時驗證失敗,它不會引發錯誤。

raw_coupon.each do |raw_coupon| 
    coupon = Coupon.find_or_initialize_by_store_id_and_coupon_code(raw_coupon.store_id, raw_coupon.coupon_code) 
    coupon.save! if coupon.new_record? #This just saves you from extra DB calls. 
end 

我用save!如果您的驗證失敗,則引發異常。只是供參考