我怎么写这个活跃的记录? (Rails 3.1)

时间:2011-11-06 08:26:43

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-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

如何写出 [此商店的优惠券代码尚不存在]

注意:多个商店可以使用相同的优惠券代码,因此我需要检查该商店是否存在相同的优惠券代码。

编辑:以下是模型关联:

  • raw_coupon:has_one:coupon
  • 优惠券:belongs_to:raw_coupon&& belongs_to的:存储
  • store:has_many:优惠券

2 个答案:

答案 0 :(得分:1)

只需向优惠券添加唯一的验证,并在致电coupon.save时注意错误:

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

The :scope limits对优惠券store_id的优惠券代码进行唯一性检查。

您还应该在couponsstore_id上为coupon_code添加唯一索引,作为额外的保护层。

答案 1 :(得分:0)

你可以使用find_or_initialize_by帮助器。我不推荐使用find_or_create_by帮助器,因为如果在创建时验证失败,它不会引发错误。

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

我用过保存!如果验证失败,则引发异常。仅供参考