2010-04-01 4 views
4

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

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

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

Мой вопрос:

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

+0

Есть ли альтернатива использованию полиморфизма здесь? – keruilin

+0

Да ... см. Мои правки снова :) Это просто озарило мое то, что вы действительно были после. С будущими вопросами было бы лучше включить фактический код модели. Помог бы мне с самого начала (потом снова я был повсюду, так что, возможно, это был только я :) –

+0

да, не думайте, что это вы! это было мое первоначальное заявление. thx для справки. – keruilin

ответ

4

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

+0

Tony, будет ли это работать, если поля order_details и order_status находятся в модели Order? – keruilin

+0

Ах жаль ... см. Редактировать –

Смежные вопросы