Две модели, одна STI и валидация

Скажем, у меня есть две таблицы — «Продукты» и «Заказы». Для простоты предположим, что единовременно можно приобрести только один продукт, поэтому таблицы соединения, такой как order_items, нет. Таким образом, отношение состоит в том, что у продукта много заказов, а заказ принадлежит продукту. Следовательно, product_id — это fk в таблице Order.

Таблица продуктов STI — с подклассами A, B, C.

Когда пользователь заказывает продукт подкласса C, необходимо проверить две специальные проверки в полях модели заказа order_details и order_status. Эти два поля могут быть нулевыми для всех других подклассов продуктов (т. е. A и B). Другими словами, для этих двух полей не требуется выполнять проверку, когда пользователь покупает A и B.

Мой вопрос:

Как мне написать проверки (возможно, пользовательские?) в модели заказа, чтобы модель заказа знала, что нужно запускать проверки только для двух полей ITS — order_details и order_status — когда fk_id для подкласса продукта C сохраняется в таблице заказов ?


person keruilin    schedule 01.04.2010    source источник
comment
Есть ли здесь альтернатива использованию полиморфизма?   -  person keruilin    schedule 02.04.2010
comment
да... посмотрите мои правки еще раз :) До меня только что дошло, чего вы на самом деле добивались. С будущими вопросами может быть лучше включить фактический код модели. Помог бы мне с самого начала (опять же я был повсюду, так что, возможно, это был только я :)   -  person Tony Fontenot    schedule 02.04.2010
comment
да, не думай, что это ты! это было мое первоначальное заявление о проблеме. спасибо за помощь в работе.   -  person keruilin    schedule 02.04.2010


Ответы (1)


Ключевым моментом является добавление метода validate в модель Order для проверки специфики:

  def validate
    if product and product.type_c?
      errors.add(:order_details, "can't be blank") if order_details.blank?
      # any other validations
    end
  end

Или что-то вдоль этих линий. Просто проверьте тип в validate и добавьте соответствующие ошибки. Я только что придумал функцию type_c?. Просто проверьте тип, однако ваша модель Product определена.

person Tony Fontenot    schedule 01.04.2010
comment
Тони, будет ли это работать, если в модели Order есть поля order_details и order_status? - person keruilin; 02.04.2010