このロジックを自分の見解から削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3798459

  •  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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top