2010-10-28 6 views
1

je les modèles suivants:Rails association HABTM à travers deux tables de jointure

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => "User", :foreign_key => :friend_id 
    has_and_belongs_to_many :friend_groups 
end 

class FriendGroup < ActiveRecord::Base 
    has_and_belongs_to_many :friendships 
end 

Comment puis-je déclarer que FriendGroup has_and_belongs_to_many :friends through :friendships?

Je voudrais avoir FriendGroup.friend_ids, donc dans le formulaire je peux simplement définir un champ 'friend_group[friend_ids][]' et simplement appeler FriendGroup.create(params[:friend_group]) sans aucune logique supplémentaire.

Répondre

0

Je suis confus sur ce que vous essayez de faire avec FriendGroups.

Votre amitié de base est modélisé comme:

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => "User" 
end 

class User < ActiveRecord::Base 
    has_many :friendships 
    has_many :friends, :through => :friendships 
end 

Vous souhaitez créer une masse records d'amitié entre tous les utilisateurs que vous transmettez? C'est probablement une sorte de problème de permutation. Pas quelque chose que vous auriez besoin d'un autre modèle pour. Peut-être une méthode de classe sur Friendship comme interconnect(user_ids).

Si vous souhaitez trouver des groupes d'utilisateurs qui sont tous des amis les uns avec les autres, cela donne l'impression d'entrer dans la théorie des graphes et la connectivité.

EDIT:

Dans le cas de FriendGroups juste être des conteneurs génériques d'amis avec un nom attaché que je ferais quelque chose comme ceci:

class User < ActiveRecord::Base 
    has_many :friend_groupings 
    has_many :friend_groups 
    has_many :friendships 
    has_many :friends, :through => :friendships 
end 

class FriendGrouping < ActiveRecord::Base 
    belongs_to :friend_group 
    belongs_to :friend 
end 

class FriendGroup < ActiveRecord::Base 
    has_many :friend_groupings 
    has_many :friends, :class_name => "User", :through => :friend_groupings 
    belongs_to :user 

    validates_presence_of :name # Name of FriendGroup 
end 

je ne serais probablement FriendGroups nid sous Utilisateurs, et Demandez à FriendGroups d'accepter les attributs_nested_for FriendGroupings. Je le ferais dans le contrôleur FriendGroup et dans la vue pour le FriendGroup permet à l'utilisateur de définir le nom du groupe et de leur donner des cases à cocher pour chacun de leurs amis à mettre dans le groupe. Pour chaque ami sélectionné, créez un nouveau FriendGrouping entre FriendGroup et l'utilisateur. Cela devrait vous apporter ce que vous voulez.

+0

Voici comment cela fonctionne sur le site. Lorsque l'utilisateur ajoute des amis, les objets 'Friendship' sont créés. Ensuite, il peut aller à sa liste d'amis, sélectionner certains d'entre eux et créer un «FriendGroup» nommé (par exemple, famille, camarades de classe, etc.). La question est de savoir quel utilisateur doit soumettre pour créer un groupe: 'user_ids' ou' friendship_ids'. Avec 'friendship_ids' tout est facile dans le modèle, mais il me semble plus logique et cohérent que vous créez réellement un groupe d'utilisateurs, pas un groupe de relations. Donc, je voudrais garder 'friendship_ids' invisible pour l'utilisateur. – RocketR

+0

J'ai édité la réponse pour traiter avec FriendGroups. Je pense que c'est davantage ce que vous cherchez. –

+0

Bien, merci. – RocketR

0

classe FriendGroup < ActiveRecord :: Base has_and_belongs_to_many: amis,: => par: friendgroups fin

0

Eh bien, je trouve pas une ligne, mais la solution à deux lignes qui semble assez élégante:

class FriendGroup < ActiveRecord::Base 
... 
    attr_accessor :friend_ids 
    before_create {|fg| fg.friendships = Friendship.find_all_by_user_id_and_friend_id(fg.user_id, fg.friend_ids)} 
Questions connexes