2010-01-02 3 views
0

Je suis aux prises avec une association has_many. J'ai une demande d'agenda. Les joueurs du modèle sont les suivants:has_many association avec un modèle de données non traditionnel

  • utilisateur
  • UserFriend
  • UserFoodProfile

Je veux être en mesure d'obtenir à tous les aliments que les amis d'un utilisateur ont mangées. Donc, je veux être en mesure d'obtenir: current_user.friends.profiles

J'ai configuré les associations correctement jusqu'ici pour pouvoir accéder à current_user.friends, mais maintenant je veux pouvoir obtenir toutes les entrées de mes amis aussi les 30 derniers jours.

Voici mes modèles

class User < ActiveRecord::Base 

    cattr_reader :per_page 
    @@per_page = 20 

    has_many :user_food_profiles 
    has_many :preferred_profiles 
    has_many :food_profiles, :through => :user_food_profiles 
    has_many :weight_entries 
    has_one :notification 
    has_many :user_friends 
    has_many :friendships, :class_name => "UserFriend", :foreign_key => "friend_id" 
    has_many :friends, :through => :user_friends 

class UserFriend < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :friend, :class_name => "User", :foreign_key => "friend_id" 

class UserFoodProfile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :food_profile 
    belongs_to :post 

Le modèle UserFriend est configuré de la façon suivante:

  • id
  • user_id
  • friend_id
  • friend_name

Je veux me connecter à user_food_profiles d'un ami afin que je puisse obtenir le user_food_profiles actuel d'un ami de l'utilisateur comme "entrées" mais tout ce que j'ai essayé n'a pas fonctionné. Comment pourrais-je configurer cette association?

essayé de le faire:

  • UserFriend: has_many :user_food_profiles, :as => 'entries'
  • UserFoodProfile: belongs_to :friend, :foreign_key => 'friend_id'

Toutes les idées sur la façon de faire ce travail? Tenté de créer un finder_sql personnalisé mais je suis sûr que cela peut fonctionner avec les associations.

Répondre

0

Un "utilisateur" n'est-il pas simplement un autre utilisateur figurant dans la base de données? Laisser votre UserFriend être une relation many_to_many (soit avec "has_and_belongs_to_many" ou "has_many: through"): chaque utilisateur peut avoir plusieurs utilisateurs comme amis. Vous pouvez ensuite lier ces user_ids (qui pourraient être dans la table many_to_many appelée 'friend_id' si vous préférez) à leur profil foodprofile, car il utilise le même lien que user.foodprofile.

0

Ceci est la ligne que je vois être le problème:

class User < ActiveRecord::Base 
    # <snip/> 
    has_many :friendships, 
       :class_name => "UserFriend", 
       :foreign_key => "friend_id" 

Je suppose que vous utilisez une table de jointure appelé ici user_friend. Cela signifierait que la clé étrangère devrait être "user_id".

Maintenant, à moins que vous allez stocker des métadonnées supplémentaires dans ce modèle de UserFriend, il n'est pas nécessaire - vous pouvez vous en sortir avec une relation has_and_belongs_to_many autoréférentiel comme ceci:

has_and_belongs_to_many :friends, 
          :class_name => "User", 
          :join_table => "user_friends", 
          :foreign_key => "user_id", 
          :association_foreign_key => "friend_id" 

Faire cela, vous tous avoir à faire est user.friends.profiles assez facilement. Maintenant, si la relation est bidirectionnelle, elle devient un peu plus complexe, mais je pense que cela devrait au moins vous aider à démarrer.

Questions connexes