Pregunta

Soy un novato de Ruby on Rails y tenía una pregunta sobre la lógica de la vista en caso de objetos asociados:

Mis modelos se parecen a

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

Y lo que quiero mostrar es algo así como una lista de todas las publicaciones y los primeros tres comentarios para cada una.

Por lo tanto, mantuve la acción del índice de control de publicación simple

class PostController < ApplicationController
  #..
  def index 
    @posts = Post.find(:all)
  end
  #..
end

Ahora en views / posts / index.html.erb puedo hacer algo como esto @posts.comments que puedo recorrer para las tres primeras entradas. Pero, ¿cómo accedo a la funcionalidad que normalmente se realiza en el modelo (en este caso, el modelo asociado), como ordenar, definir el alcance, etc. en la vista (o controlador)?

¿Fue útil?

Solución

Debe evitar escribir un inicio de sesión comercial complejo en la vista. En este caso, su ejecución es lo suficientemente simple como para que pueda escribir todo el código en su vista. Debería verse así

<% @posts.each do |post| %>
  <% @post.comments.all(:limit => 3, :order => "created_at DESC").each do |comment| %>
      do something
  <% end %>
<% end %>

Hay un par de posibles mejoras. Primero, use 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 estoy en lo cierto, el .each se puede eliminar.

<% @posts.each do |post| %>
  <% @post.comments.recent do |comment| %>
      do something
  <% end %>
<% end %>

Si lo prefiere, también puede definir una relación personalizada (esto es para relaciones realmente complejas).

Otros consejos

Puede usar un método de búsqueda en la asociación que especifique un límite como:

@post.comments.find(:all, :limit => 3)

en su vista, o puede crear otra asociación en su modelo de publicación algo así como:

has_many :first_three_comments, :limit => 3, :class_name => "Comment" 

y luego puedes hacer referencia a esa asociación como

@ post.first_three_comments.each do | comentario | ...

Espero que eso ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top