J'ai des utilisateurs, des messages et des commentaires. L'utilisateur peut publier un seul commentaire à chaque publication.Récupérer tous les messages où un utilisateur donné a fait un commentaire, Ruby on Rails
class User < ActiveRecord::Base
has_many :posts
has_many :comments
end
class Post < ActiveRecord::Base
has_many :comments
belongs_to :user
end
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
Sur userpage (http://host/users/1
par exemple) Je veux montrer tous les messages où l'utilisateur donné a commenté. Chaque message aura alors tous les autres commentaires.
Je peux faire quelque chose comme ça dans mon contrôleur de l'utilisateur:
def show
@user = User.find(params[:user_id])
@posts = []
user.comments.each {|comment| @posts << comment.post}
end
De cette façon, je trouverai l'utilisateur, puis tous ses commentaires, puis poste correspondant à chaque commentaire, puis (à mon avis) pour chaque Je publierai post.comments. Je suis totalement nouveau dans Rails, donc je peux le faire =) Mais je pense que c'est en quelque sorte mauvais et il y a une meilleure façon de le faire, peut-être que je devrais utiliser des scopes ou named_scopes (je ne sais pas encore effrayant).
Alors pouvez-vous me montrer la bonne direction ici?
Je dois admettre que je me suis perdu la première fois que j'ai lu ceci, parce que mon esprit était toujours bloqué sur une relation 'user -> post -> comment'. Mais, après l'avoir examiné quelques fois, j'ai fait le pivot du modèle mental 'utilisateur -> commentaire -> poste'. Le commentaire ressemble à un modèle de correspondance classique de plusieurs à plusieurs, et tout cela semble si simple! –
Wow! Cela fonctionne très bien. Et c'était plus facile que je ne le pensais. Je vous remercie. – fetsh
@Edward Vous êtes sur l'ongle. 'has_many: through =>' est plus ou moins le même que 'has_and_belongs_to_many' excepté' has_many: through => 'vous permet de travailler sur l'association de jointure. C'est un cas d'utilisation courant, bien que cela fonctionne parfaitement pour @ilzoff. –