Вопрос

Допустим, у меня есть два стола - продукты и заказы. Для простоты предположим, что только один продукт можно приобрести за раз, так что нет таблицы соединения, как order_items. Таким образом, отношения в том, что у продукта есть много заказов, а порядок принадлежит продукту. Следовательно, product_id является FK в таблице заказа.

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

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

Мой вопрос:

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top