このロジックを自分の見解から削除するにはどうすればよいですか?
-
05-10-2019 - |
質問
私はこの問題に頭を包み込もうとしています。意見にはそれほど論理があるべきではないことを知っています。ユーザー、投稿、コメントを含むアプリがあります。ユーザーには多くの投稿やコメントがあります。
class User < ActiveRecord::Base
has_many :posts
has_many :comments
投稿はユーザーに属し、多くのコメントがあります。
class Post < ActiveRecord::Base
has_many :comments
belongs_to :user
コメントはユーザーと投稿に属します
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user
私の投稿#show viewでは、投稿の下でコメントを表示します。コメントをしたユーザーの名前を見せたいです。現時点では、私の見解ではこれを持っています。
<% @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 %>
おそらく、投稿コントローラーにそのロジックがあるはずです。しかし、私はかなり混乱しています。 @post.commentsは、投稿に属するコメントの配列(?)を返します。つまり、@commenter = @post.comments.useridを持つことができません。私は問題に混乱しているので、それをうまく説明していなかったかもしれません。
解決
実際、コメントループ中に使用できます comment.user
あなたが宣言したので、ユーザーのデータを取得するために User
has_many
Comments
関係。
他のヒント
最初の答えをより明確にするために、あなたはこれを行うだけです:
<%= link_to comment.user, comment.user %>
ユーザーモデルでは、このようなto_sメソッドをオーバーライドするため、コメント。ユーザーは必要な文字列を返します。
def to_s
self.login
end
最後に、comment.userごとにDBを個別に照会する代わりに、熱心な読み込みを1つのSQLコールで取得します。投稿モデルで:
class Post < ActiveRecord::Base
has_many :comments, :include => :user
ポストコントローラーで:
def show
@post = Post.find(params[:id], :include => :comments)
所属していません StackOverflow