2012-08-29 5 views
0

Prenons l'exemple suivant d'un forum de base.Besoin d'aide pour comprendre comment ActiveRecord fonctionne

class Forum < ActiveRecord::Base 
    has_many :topics, :dependent => :destroy 
end 

class Topic < ActiveRecord::Base 
    belongs_to :forum 
    belongs_to :user 
    has_many :posts, :dependent => :destroy 
end 

class Post < ActiveRecord::Base 
    belongs_to :topic 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :topics 
end 

Maintenant, disons que je voulais ajouter la possibilité d'aller chercher les informations de la "dernière publication" de chaque forum. Ma table de forum a une colonne appelée "last_post_id" qui contient l'identifiant du dernier post réalisé sur ce forum. Si je comprends comment fonctionne le record actif, je besoin d'ajouter une relation « has_one » à mon modèle de forum et préciser la clé primaire que je veux utiliser, comme ceci:

classe Forum < ActiveRecord :: Base has_many: sujets ,: dependent =>: détruire has_one: last_post,: class_name => 'post',: primary_key =>: last_post_id fin

Alors ma question ressemblerait à ceci:

@forums = Forum.all(:include => [:last_post]) 

Est-ce droit jusque là? Mais dis que je voulais aussi aller chercher les informations de l'utilisateur qui a posté ce dernier message. Eh bien, ma table de courrier a une colonne "user_id" que je pourrais utiliser. Dois-je créer une relation "has_one" comme je l'ai fait avec last_post? Cela ne semble pas fonctionner:

class Forum < ActiveRecord::Base 
    has_many :topics, :dependent => :destroy 
    has_one :last_post , :class_name => 'Post', :primary_key => :last_post_id 
    has_one :last_poster, :class_name => 'User', :primary_key => :last_post_user_id 
end 

Comment puis-je utiliser la valeur de la last_post.user_id pour récupérer les informations utilisateur à partir de la table utilisateur. La requête brute ressemblerait à quelque chose comme ceci:

SELECT forums.*, 
     last_post.id    as last_post_id, 
     last_post.user_id   as last_post_user_id, 
     last_post_user.username as last_post_username, 
    FROM forums as forums 
INNER JOIN posts as last_post  ON last_post.id  = forums.last_post_id 
INNER JOIN users as last_post_user ON last_post.user_id = last_post_user.id 

Notez que je prends les informations utilisateur à l'aide du last_post.user_id. Comment faites-vous cela en utilisant des rails? L'objectif est d'avoir les variables suivantes disponibles pour rendre les dernières informations de publication dans les vues. Est-ce que je comprends comment cela fonctionne correctement, qu'est-ce que je fais de mal?

Répondre

2

Je dirais que le last_poster sur le modèle du forum semble nécessaire. Puisqu'il n'y en a qu'un seul, je pourrais juste laisser cela se charger paresseusement quand j'ai appelé cette information dans la vue.

Ainsi, lorsque vous travaillez dans votre vue ne vient forum.last_post.user.username

+0

Cela a été très utile, merci! – Ken

Questions connexes