2010-03-05 9 views
0

Spécifiquement, j'essaie de comprendre s'il est possible de générer du SQL qui fait ce que je veux faire dans la méthode find_by_sql de Ruby-on-Rails. Imaginez qu'il y ait des utilisateurs, qui sont joints cycliquement à d'autres utilisateurs par une table de jointure. Chaque utilisateur a la possibilité de créer des commentaires.Est-il possible de définir une seule requête SQL qui dessine un ensemble de foreign_keys admissibles à partir d'une table et les utilise ensuite pour en filtrer une autre?

Je voudrais une requête SQL pour retourner les 100 derniers commentaires créés par les amis d'un utilisateur donné afin que je puisse les afficher tous dans un endroit pratique pour l'utilisateur à voir.

Ceci est difficile, car je cherche essentiellement à filtrer les commentaires en indiquant si leurs clés étrangères pour leur auteur sont contenues dans un ensemble de clés obtenues à partir des clés primaires des amis de l'utilisateur.

Editer: Clarifier la configuration. Je ne sais pas exactement comment écrire une définition de schéma, donc je vais le décrire en termes de Rails.

class User 
    has_many :friends, :through => :friendships 
    has_many :comments 
end 
class Friendship 
    belongs_to :user 
    belongs_to :friend, :class_name => "User", :foreign_key => "friend_id" 
end 
def Comment 
    has_one :User 
end 
+0

vous êtes plus susceptible d'obtenir une réponse si vous affichez les définitions de schéma de table –

Répondre

1

Ce n'est pas si compliqué, vous utilisez simplement des jointures. Pour obtenir uniquement les commentaires, vous devez uniquement joindre la table Friendships et la table Comments, mais vous souhaitez probablement également obtenir des informations de la table Users pour la personne qui a écrit le commentaire.

Cela obtiendrait les 100 derniers commentaires des gens qui sont amis avec l'utilisateur avec ID 42:

select top 100 c.CommentId, c.CommentText, c.PostDate, u.Name 
from Friendships f 
inner join Users u on u.UserId = f.FriendUserId 
inner join Comments c on c.UserId = u.UserId 
where f.UserId = 42 
order by c.PostDate desc