Две модели, одна STI и валидация - PullRequest
4 голосов
/ 01 апреля 2010

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

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

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

Мой вопрос:

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

1 Ответ

4 голосов
/ 01 апреля 2010

Ключ в том, чтобы добавить метод 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 определена.

...