2010-05-12 8 views
0

J'ai quatre modèles: Client, QueueRed, QueueBlue, QueueGreen.Rails: Modèle de conception pour stocker l'ordre des relations

Les modèles de files d'attente ont une relation un à plusieurs avec les clients

Un client doit toujours être dans une file d'attente

Un client ne peut être dans une file d'attente à la fois

Un client peut changer les files d'attente

Nous devons être en mesure de connaître les clients position actuelle dans leur file d'attente respective

dans un o Modèle de bjet Les files d'attente auraient juste une propriété de tableau contenant des clients, mais ActiveRecord n'a pas de tableaux.

Dans une base de données, je créerais probablement des tables supplémentaires uniquement pour gérer l'ordre des histoires dans la file d'attente.

Ma question est ce que c'est la meilleure façon de modéliser la relation dans ActiveRecord? Évidemment, il y a plusieurs façons de le faire, mais quel est le meilleur ou le plus conforme à la façon dont ActiveRecord devrait être utilisé?

Cheers,

Chris

Répondre

2

Vous devriez probablement se pencher sur le plug-in acts_as_list.

3

Je suggère de créer seulement deux modèles: client et file d'attente.

La table de file d'attente doit être constituée de: customer_id, queue_type_id, position. Vous pouvez également créer un modèle QueueType, mais ce n'est pas nécessaire.

modèle client:

has_one :queue 

modèle Queue:

belongs_to :customer 

validates_uniqueness_of :customer_id 
validates_uniqueness_of :position, :scope => :queue_type_id 

named_scope :red, :conditions => {:queue_type_id => 0} 
named_scope :green, :conditions => {:queue_type_id => 1} 
named_scope :blue, :conditions => {:queue_type_id => 2} 

J'ai ajouté named scopes pour gérer les couleurs des files d'attente.

Un client ne peut être dans une file d'attente à la fois

Première validation dans le modèle de file d'attente devrait interdire le client d'être dans plus d'une file d'attente.

Un client peut changer les files d'attente

@customer = Customer.first 
@customer.queue.queue_type_id = 1 
@customer.save 

Ici vous qui devraient être carfull avec position en file d'attente, car il doit être unique dans le cadre de queue_type_id.

Nous devons être en mesure de connaître les clients position actuelle dans leur file d'attente respective

customer.queue.position 

Dans un modèle d'objet, les files d'attente serait tout simplement avoir une propriété de tableau contenant les clients, mais ActiveRecord doesn pas de tableaux.

@queue = Queue.red 

Il retourne un tableau de clients. Je ne sais pas ce que vous vouliez dire par "ActiveRecord n'a pas de tableaux".

Un client doit toujours être dans une file d'attente

Hm, juste:

@customer = Customer.new 
@customer.build_queue 

? Ou vous pouvez ajouter un peu before_save ou peut-être mieux, validation simple:

validate :ensure_customer_is_in_queue 

def ensure_customer_is_in_queue 
    errors.add_to_base "Customer should be in a queue!" unless self.queue 
end 
2

Ceci est un obtenir des commentaires/Outre la réponse ci-dessus acceptée. Acts_as_list n'est pas conçu pour autre chose qu'un prototype, et dès le départ, il ne gère pas du tout la concurrence ou l'intégrité des données. À tout le moins, vous devez définir votre niveau d'isolation à sérialisable! Voici un short screen cast avec plus d'informations, et quelques solutions de contournement.

Questions connexes