2 Stimmen

Anzeige der zugehörigen Objekte

Ich bin ein Ruby on Rails-Neuling und hatte eine Frage über die Ansichtslogik im Falle von verbundenen Objekten:

Meine Modelle sehen ähnlich aus wie

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

Und was ich anzeigen möchte, ist so etwas wie eine Liste aller Beiträge und der ersten drei Kommentare zu jedem Beitrag.

Daher habe ich die Aktion für den Post-Contoller-Index einfach gehalten

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

Jetzt im views/posts/index.html.erb Ich kann etwas wie folgt tun @posts.comments die ich in eine Schleife für die ersten drei Einträge einfügen kann. Aber wie greife ich in der Ansicht (oder im Controller) auf Funktionen zu, die normalerweise im Modell (in diesem Fall dem zugehörigen Modell) ausgeführt werden, z. B. Bestellung, Scoping usw.?

1voto

Simone Carletti Punkte 168374

Sie sollten es vermeiden, komplexe Geschäftsanmeldungen in der Ansicht zu schreiben. In diesem Fall ist Ihre Ausführung so einfach, dass Sie den gesamten Code in Ihrer Ansicht schreiben können. Er 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 eine Reihe möglicher Verbesserungen. Erstens, verwenden Sie ein 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 %>

Wenn ich richtig liege, kann das .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).

1voto

Corban Brook Punkte 21070

Sie könnten eine Suchmethode für die Assoziation verwenden, die einen Grenzwert angibt:

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

in Ihrer Ansicht, oder Sie können eine weitere Assoziation in Ihrem Post-Modell erstellen, etwa so:

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

und dann können Sie einfach auf diese Assoziation verweisen wie

@post.first_three_comments.each do |comment| ...

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X