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?
Cela a été très utile, merci! – Ken