【问题标题】:How can I write this active record? (Rails 3.1)我怎样才能写这个活动记录? (轨道 3.1)
【发布时间】:2011-11-06 08:26:43
【问题描述】:

我有三个模型:

  • 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 :coupons

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    只需向 Coupon 添加一个唯一验证,并在您致电 coupon.save 时注意错误:

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

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

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

    【讨论】:

    • 零呢?一个商店可以在系统中拥有多张优惠券,其中coupon_code为nil。
    • @Hopstream:没有代码的优惠券?对我来说听起来很奇怪,但有 :allow_nil 选项,并且唯一索引中允许多个 NULL。
    • 有没有办法在条件条件下做到这一点(因为否则使用验证总是会抛出错误)——像这样处理数千张优惠券会抛出数千个错误。
    • @Hopstream:您可以尝试计算匹配项,但这将是一个丑陋的组合,一个对象应该负责确保其自身的内部有效性。
    【解决方案2】:

    你可以使用 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
    

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

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2020-05-18
      相关资源
      最近更新 更多