2009-01-23 6 views
4

J'ai une application où je veux lier une instance d'un modèle à une autre instance du même modèle via un autre modèle (Task1> Relation < Task2) et je me demande si je peux utiliser has_many: through pour cela. Fondamentalement, le modèle de relation aurait des informations supplémentaires (type_of_relationship, lag), donc il serait idéal de l'avoir comme un modèle de jointure. Cependant, il n'y a pas deux modèles à joindre, un seul ... à lui-même. Est-ce que le has_many: à travers encore travailler? Si oui, à quoi ressemblerait la table de jointure? Avec les conventions Rails, vous auriez deux colonnes appelées Activity_id, qui ne fonctionneront évidemment pas dans la base de données. Sinon, je peux utiliser has_many_and_belongs_to pour en configurer plusieurs entre le modèle de tâche et le modèle de relation, mais je ne suis pas sûr que cela décrit avec précision une relation qui ne devrait jamais lier deux modèles de tâche dans un modèle de relation. (bien que les Tâches puissent bien sûr appartenir à plus d'une Relation, donc plusieurs). Mon instinct dit d'aller avec has_many_and_belongs_to et de trier les règles dans les modèles, mais y at-il une meilleure façon de le faire? Je tourne en rond sur celui-ci!Rails: has_many: à travers ou has_many_and_belongs_to?

Toute aide appréciée.

Répondre

8

has_many: correspond parfaitement à votre situation. Je ne connais pas les détails de votre modèle, mais disons que vous avez des utilisateurs et que chaque utilisateur peut avoir d'autres utilisateurs comme contacts. Vous pouvez modéliser cette situation comme suit:

class User < ActiveRecord::Base 
    has_many :contact_records, :foreign_key => :owner_id 
    has_many :contacts, :through => :contact_records, :class_name => "User" 
end 

class ContactRecord < ActiveRecord::Base 
    belongs_to :owner, :class_name => "User" 
    belongs_to :user 
end 
+0

Excellent! Ceci est exactement ce que je cherchais. Infiniment reconnaissant. Je suppose que la clé ici est de créer un "pseudo-modèle" (si c'est le bon terme) appelé Contacts mais de le renvoyer à l'utilisateur par le symbole: class_name plutôt que de créer un modèle de contacts réel? –

Questions connexes