Est-il possible d'avoir plusieurs relations has_many :through
qui se croisent dans Rails? J'ai reçu la suggestion de le faire comme une solution pour une autre question que j'ai posté, mais j'ai été incapable de le faire fonctionner.Ruby-on-Rails: Multiple has_many: à travers possible?
Les amis sont une association cyclique via une table de jointure. L'objectif est de créer un has_many :through
pour friends_comments
, donc je peux prendre un User
et faire quelque chose comme user.friends_comments
pour obtenir tous les commentaires de ses amis dans une seule requête.
class User
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = #{Friendship::FULL}"
has_many :comments
has_many :friends_comments, :through => :friends, :source => :comments
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end
Cela semble très bien, et est logique, mais ne fonctionne pas pour moi. Ceci est l'erreur que je reçois dans la partie pertinente lorsque je tente d'accéder aux friends_comments d'un utilisateur:
ERROR: column users.user_id does not exist
: SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments".user_id = "users".id WHERE (("users".user_id = 1) AND ((status = 2)))
Quand je rentre juste user.friends, qui fonctionne, c'est la requête qu'il exécute:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Il semble donc qu'il oublie complètement la relation d'amitié has_many
d'origine, puis tente d'utiliser la classe User comme table de jointure de façon inappropriée.
que je fais quelque chose de mal, ou est-ce tout simplement pas possible?
Malheureusement, l'objectif initial de cette démarche était pour que je puisse obtenir tous les commentaires des amis de SQL dans une requête. Voir ici: http://stackoverflow.com/questions/2382642/ruby-on-rails-how-to-pull-out-most-recent-entries-from-a-limited-subset-of-a-dat Si j'écris une fonction, cela entraînera un nombre N + 1 de requêtes. –
Non ce ne sera pas. Ce sera 2 requêtes. Première requête pour obtenir les amis et deuxième requête pour obtenir les commentaires pour ** tous ** les amis. Si vous avez déjà chargé les amis sur le modèle utilisateur, vous n'encourez aucun coût. J'ai mis à jour la solution avec deux autres approches. Regarde. –
@williamjones Vous n'avez pas de problème N + 1 dans les trois approches. Vous pouvez vérifier votre fichier journal pour vérifier cela. Personnellement, j'aime l'approche 1 car elle est assez élégante, c'est-à-dire 'user.friends.comments' est mieux que' user.friends_comments' –