2011-08-18 4 views
0

Je suis novice en matière de rails et j'ai une question sur la meilleure façon d'appliquer des règles personnalisées à mes associations de modèles.comment appliquer les règles d'inclusion dans les associations ActiveRecord

Par exemple, supposons que je:

class Person < ActiveRecord::Base 
    belongs_to :organization 
end 

class Organization < ActiveRecord::Base 
    has_many :people 
end 

et supposons maintenant que je veux seulement permettre la commande Organization.people << Person.new(...) pour réussir si le nouvel objet Person est compatible avec l'autre people qui ont déjà été ajoutés à la Organization . Cela impliquerait d'effectuer un contrôle de validation sur tous les éléments existants de Organization.people et de décider si le nouveau Person pouvait être ajouté ou non.

Il me semble que je peux le faire en remplaçant tous les opérateurs d'affectation Organization.people (tels que << et =) et de mettre ma logique de validation dans la routine de remplacement.

Est-ce la meilleure façon d'y parvenir?

Merci!

Répondre

0

Je pense que vous pourriez mettre une validation dans la classe Person. Il serait un test contre les autres personnes dans self.organiation.people. Je ne sais pas si je remplacer le < < sur la relation a beaucoup parce que si vous décidez de créer une personne comme Person.new (: organization => some_org) votre override < < ne serait pas utilisé. Si la validation se déroule sur la classe Personne, elle obtiendra des exercices, peu importe comment vous créez la personne.

+0

Je vois ce que vous voulez dire. Cependant, la décision appartient vraiment à la classe Organisation. La classe Personne ne devrait pas décider qui fait partie de l'Organisation - cela devrait être à la charge de l'Organisation. Par conséquent, je pense que je vais accepter votre suggestion de déclencher la validation de la classe Person (c'est-à-dire en validant contre: organization) mais la validation déléguera simplement la décision à l'organisation en appelant une fonction de décision dans la classe Organization. Merci. – Denis

+0

Oui, je suis d'accord. Vous pouvez facilement avoir un validate: blah, puis un délégué: blah à l'oranization. –

Questions connexes