Как я могу написать эту активную запись?(Rails 3.1) - PullRequest
0 голосов
/ 06 ноября 2011

У меня есть три модели:

  • raw_coupon
  • купон
  • store

Если я перебираю raw_coupons, какя могу сохранить его как купон, только если тот же код купона еще не существует для этого магазина?Вот код, чтобы сделать его более понятным:

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: купон
  • купон: own_to: raw_coupon &&ОВА

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Просто добавьте уникальную проверку в Coupon и следите за ошибками при вызове coupon.save:

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

:scope ограничивает проверку уникальности для кодов купонов длякупон store_id.

Вы также должны добавить уникальный индекс к coupons на store_id и coupon_code в качестве дополнительного уровня защиты.

0 голосов
/ 11 ноября 2011

вы можете использовать помощник 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

Я использовал save!поднять исключение, если ваша проверка не пройдена.Просто к вашему сведению

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...