Frage

Ich bin ein Ruby on Rails Neuling und hatte eine Frage über die Ansicht Logik im Fall eines zugehörigen Objekte:

Meine Modelle ähneln

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end
so etwas wie eine Liste aller Beiträge und die ersten drei Kommentare für jeden

Und was ich will, ist angezeigt.

So hielt ich den Posten contoller Index Aktion einfach

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

Jetzt im views/posts/index.html.erb ich so etwas tun kann @posts.comments was ich kann Schleife für die ersten drei Einträge. Aber wie ich Funktionalität zugreifen, die normalerweise in dem Modell durchgeführt wird (in diesem Fall das zugehörige Modell) wie Bestellung, Scoping usw. in der Ansicht (oder Controller)?

War es hilfreich?

Lösung

Sie sollten vermeiden, in der Ansicht komplexes Geschäft Login zu schreiben. In diesem Fall ist Ihre Ausführung einfach genug, dass Sie den gesamten Code aus Ihrer Sicht schreiben. Es sollte wie folgt aussehen

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

Es gibt ein paar possibile Verbesserungen. Zuerst eine named_scope verwenden.

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 %>

Wenn ich Recht habe, kann der .each entfernt werden.

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

Wenn Sie möchten, können Sie auch eine benutzerdefinierte Beziehung definieren (dies ist für wirklich komplexe Beziehungen ist).

Andere Tipps

Sie können eine Suchmethode über die Assoziation benutzen, die eine Grenze wie angegeben:

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

Ihre Ansicht nach, oder Sie können wie anderen Verein in Ihrem Beitrag Modell etwas erstellen:

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

und dann können Sie verweisen nur, dass die Assoziation wie

@ post.first_three_comments.each tun | Kommentar | ...

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top