2010-10-22 28 views
5

J'ai une relation parent/enfant via notre table d'utilisateurs, avec des modèles en tant que tels:Façon correcte de forcer l'unicité sur un modèle de jointure? (Has_many: par)

class User < ActiveRecord::Base 

    # Parents relationship 
    has_many :children_parents, :class_name => "ParentsChild", :foreign_key => "child_id", :dependent => :destroy 
    has_many :parents, :through => :children_parents 

    # Children relatiopnship 
    has_many :parents_children, :class_name => "ParentsChild", :foreign_key => "parent_id", :dependent => :destroy 
    has_many :children, :through => :parents_children 
    ... 
end 

Et parents_child.rb:

class ParentsChild < ActiveRecord::Base 

    belongs_to :parent, :class_name => "User" 
    belongs_to :child, :class_name => "User" 

end 

En ce moment, il est possible dans notre formulaire "ajouter des enfants" (en utilisant juste les attributs imbriqués de vanille) pour ajouter le même utilisateur comme un enfant plusieurs fois pour les parents. Je ne suis pas sûr de la «bonne» façon de forcer l'unicité dans la relation ParentsChild, bien que je penche vers un index unique sur la couche (parent_id, child_id) de base de données (en utilisant une migration bien sûr). Je suis sûr que je pourrais aussi appliquer des contraintes d'unicité dans la méthode UsersController :: update, mais je préférerais éviter de changer ce code (pour l'instant, il ne référence pas du tout les parents/enfants, grâce aux attributs imbriqués dans le formulaire/modèle) si possible. Je suis le plus soucieux de m'assurer que nous utilisons la solution "appropriée". Quelle est la bonne façon de faire cela?

Répondre

6

En utilisant has_many: à travers, vous pouvez spécifier: Uniq en option, comme ceci:

has_many :parents, :through => :children_parents, :uniq => true 
+1

Certainement aurait dû examiner la solution la plus simple possible d'abord. Merci! –

+0

Oui! Je passe tellement de temps avec ça, ta réponse était exactement ce dont j'avais besoin. – Matthew

+5

ou dans les rails 4, 'has_many: parents, -> {uniq},: through =>: children_parents' – courtsimas