Wie kann ich diese Logik aus meiner Sicht entfernen?
-
05-10-2019 - |
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.
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)