2011-03-11 3 views
1

J'ai un modèle de produit, un modèle Statuses et un modèle Productstatus.Utilisez des booléens ou has_many à travers?

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 

J'utilise les états de deux manières. Un, pour montrer la progression d'un produit qui traverse notre système (états bookmark, processing, approved) Une fois qu'un produit a le statut approved, il ne peut pas reculer dans le système (de sorte que je ne crée pas de publique 404) un produit doit avoir un de ces trois en tout temps pour être valide

J'utilise aussi les statuts des différents « drapeaux » sur les produits:..

  • retired lorsqu'un produit n'est plus disponible (ce produit aura également toujours le statut approved; approved == publiquement indexable dans notre plan du site, mais retired la supprime de partout sur notre site (index, archives, etc.) sans 404'ing son permalien)
  • pre-sale lorsqu'un produit est pas encore disponible (pourrait avoir l'un des trois ci-dessus)
  • needs-images (pourrait avoir l'un des trois)

Ma question est un peu à deux parter:

  1. Si je viens de faire les « drapeaux » statuts booléens sur le modèle de produit? Je demande parce que:

  2. Comment écrire une portée qui dit approved but not retired? Ou ?

Avec un booléen, je peux juste avoir une portée comme scope :not_foo where(:foo = false) et enchaînez les tout. Je dessine un vide sur la meilleure façon de faire la même chose avec la configuration ci-dessus. Je pensais que la configuration has_many :through était la voie à suivre (les drapeaux en tant que booléens semblaient être beaucoup trop de falses dans ma base de données) mais la structure/planification de base de données n'est pas mon fort.

Répondre

0

Je suggère d'utiliser state machine pour le produit d'écoulement pre-sale, approved et retired et un indicateur booléen pour needs-images pour indiquer l'état supplémentaire qui est de l'écoulement.

+0

Merci pour la suggestion. Une raison pour laquelle les transitions gemme sur aasm ou les autres? – jaacob

+0

pas de grande différence, il suffit de jeter un coup d'œil sur les deux et d'utiliser celui qui sera plus facile à démarrer, les fonctionnalités fournies sont similaires – mpapis

Questions connexes