如何从我的视图中删除此逻辑?

时间:2010-09-26 15:30:01

标签: ruby-on-rails belongs-to

我试图解决这个问题。我知道观点不应该有太多的逻辑。我有一个用户,帖子和评论的应用程序。用户有很多帖子和评论。

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。我对这个问题很困惑,所以我可能没解释清楚。

2 个答案:

答案 0 :(得分:4)

要在第一个答案中更明确,您只需执行此操作:

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

在您的用户模型中,像这样覆盖to_s方法,以便comment.user返回您想要的字符串:

def to_s
  self.login
end

最后,使用预先加载来获取一次SQL调用中的所有数据,而不是为每个comment.user分别查询数据库。在你的Post模型中:

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

在Post控制器中:

def show
  @post = Post.find(params[:id], :include => :comments)

答案 1 :(得分:3)

事实上,在评论循环期间,您可以使用comment.user来获取用户的数据,因为您已宣布User has_many Comments关系。