Affichage des objets associés
-
06-07-2019 - |
Question
Je suis un novice de Ruby on Rails et je souhaitais poser une question sur la logique d'affichage dans le cas d'objets associés:
Mes modèles ressemblent à
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
Et ce que je veux afficher, c'est quelque chose comme une liste de tous les articles et des trois premiers commentaires pour chacun.
Ainsi, j’ai gardé l’action post index index simple
class PostController < ApplicationController
#..
def index
@posts = Post.find(:all)
end
#..
end
Maintenant, dans views / posts / index.html.erb
, je peux faire quelque chose comme ceci @ posts.comments
que je peux boucler pour les trois premières entrées. Mais comment accéder aux fonctionnalités normalement utilisées dans le modèle (dans ce cas, le modèle associé), telles que la commande, la portée, etc., dans la vue (ou le contrôleur)?
La solution
Vous devez éviter d’écrire un identifiant de connexion professionnel complexe dans la vue. Dans ce cas, votre exécution est suffisamment simple pour que vous puissiez écrire tout le code dans votre vue. Cela devrait ressembler à ceci
<% @posts.each do |post| %>
<% @post.comments.all(:limit => 3, :order => "created_at DESC").each do |comment| %>
do something
<% end %>
<% end %>
Il existe plusieurs améliorations possibles. Commencez par utiliser un named_scope.
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
named_scope :recent, proc { |limit| :limit => limit || 3, :order => "created_at DESC") }
# you can also hard-code the limit value (ScottD)
named_scope :recent, :limit => 3, :order => "created_at DESC"
end
<% @posts.each do |post| %>
<% @post.comments.recent.each do |comment| %>
do something
<% end %>
<% end %>
Si je ne me trompe pas, le fichier .each peut être supprimé.
<% @posts.each do |post| %>
<% @post.comments.recent do |comment| %>
do something
<% end %>
<% end %>
Si vous préférez, vous pouvez également définir une relation personnalisée (pour les relations très complexes).
Autres conseils
Vous pouvez utiliser une méthode de recherche sur l'association qui spécifie une limite telle que:
@post.comments.find(:all, :limit => 3)
dans votre vue, ou vous pouvez créer une autre association dans votre modèle Post, par exemple:
has_many :first_three_comments, :limit => 3, :class_name => "Comment"
et vous pouvez simplement référencer cette association comme
@ post.first_three_comments.each do | comment | ...
L’espoir que cela aide.