У меня есть модель Product, модель Status и модель Productstatuses.
Product has_many :productstatuses, :dependent => :destroy
Product has_many :statuses, :through => :productstatuses
Status has_many :productstatuses
Status has_many :products, :through => :productstatuses
Productstatus belongs_to :product
Productstatus belongs_to :status
Я использую статусы двумя способами.
Во-первых, чтобы показать, как продукт проходит через нашу систему (статусы bookmark, processing, approved
. Как только продукт имеет статус approved
, он не может двигаться назад в системе (так что я не t создать общедоступный 404). Продукт должен иметь один из этих трех, чтобы быть действительным.
Я также использую статусы для разных «флагов» на товарах:
retired
когда продукт больше не доступен (этот продукт также всегда будет иметь статус approved
; approved
== публично индексируется в нашей карте сайта, но retired
удаляет его из любого места на нашем сайте (индекс, архивы и т. д.) без постоянной ссылки 404)
pre-sale
когда продукт еще не доступен (может иметь любой из трех выше)
needs-images
(может иметь любой из трех)
Мой вопрос немного двухсторонний:
Должен ли я только что сделать статусы "флагов" логическими для модели Продукта? Я спрашиваю, потому что:
Как мне написать область действия, которая говорит approved but not retired
? Или approved but not retired and not needs-images
?
С логическим значением у меня может быть просто видимость
scope :not_foo where(:foo = false)
и объедините их в цепочку. Я рисую пробел на лучший способ сделать то же самое с вышеупомянутой настройкой. Я думал, что установка has_many :through
была подходящим вариантом (флаги как булевы значения в моей базе данных показались мне избыточными falses
), но структура / планирование базы данных не моя сильная сторона.