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)?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top