Frage

Ich versuche, meinen Kopf, um dieses Problem zu wickeln. Ich weiß Ansichten nicht so viel Logik in ihnen haben sollte. Ich habe eine App mit den Benutzern, Beiträge und Kommentare. Die Benutzer haben viele Beiträge und Kommentare.

class User < ActiveRecord::Base
has_many :posts
has_many :comments

Beiträge gehören in Benutzer und haben viele Kommentare.

class Post < ActiveRecord::Base
has_many :comments
belongs_to :user

Kommentare gehören zu den Benutzern und schreiben

class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user

In meinem Beitrag # show Ansicht zeigen, dass ich Kommentare unter dem Beitrag. Ich möchte den Namen des Benutzers zeigen, wer den Kommentar gemacht. Im Moment habe ich dies in meiner Sicht:

<% @post.comments.each do |comment| %>
  <p>
    <b>Commenter:</b>
    <%= link_to  User.find(comment.userid).login, User.find(comment.userid) %>
  </p>

  <p>
    <b>Comment:</b>
    <%= comment.body %>
  </p>
<% end %>

Vielleicht sollte ich diese Logik in meine Beiträge Controller haben. Aber ich bin ziemlich verwirrt. @ Post.comments gibt einen Array zurück (?) Kommentare zur Post gehören. Das Mittel kann ich nicht @commenter = @ post.comments.userid. Ich bin von dem Problem verwirrt, damit ich es nicht gut erklärt haben könnte.

War es hilfreich?

Lösung

In der Tat während der Kommentare Schleife können Sie comment.user verwenden, um die Daten des Nutzers zu erhalten, da Sie die User has_many Comments Beziehung erklärt haben.

Andere Tipps

Um mehr explizit auf der ersten Antwort, Sie einfach tun:

<%= link_to comment.user, comment.user %>

In Ihrem User-Modell, überschreiben die to_s Methode wie folgt so comment.user die Zeichenfolge zurück Sie wollen:

def to_s
  self.login
end

Schließlich verwenden eifrig Laden alle Daten in einer SQL-Aufruf zu erhalten, statt für jeden comment.user die DB separat abfragen. In Ihrem Beitrag Modell:

class Post < ActiveRecord::Base
  has_many :comments, :include => :user

Und im Post-Controller:

def show
  @post = Post.find(params[:id], :include => :comments)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top