显示上次评论帖子的用户(Rails)?

时间:2012-03-11 10:54:53

标签: ruby-on-rails

我有一个发布模型:

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_names

  belongs_to :user

  has_many :comments, :dependent => :destroy
end

  belongs_to :post, :counter_cache => true
  belongs_to :user
end

用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :avatar, :subscribed_tag_names

  has_many :posts, :dependent => :destroy
  has_many :comments, :dependent => :destroy
end

评论模型:

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id

  belongs_to :post, :counter_cache => true
  belongs_to :user
end

这是我在 index.html.erb 视图中显示创建帖子的用户的方式:

  <% @posts.each do |post| %>
    <div id="post-<%= post.id %>" class="post">
      <h3 class="post-title"><%= link_to post.title, post %></h3>
      <div class="post-author">
        <span class="profile-picture">
          <%= image_tag post.user.avatar.url(:thumb) %>
        </span>
        <span class="post-author-name">
          <strong><%= link_to post.user.username, post.user %></strong>
        </span>
      </div>

(等...)

如何显示上次评论帖子的用户(您可以在StackOverflow和各种论坛中看到)?

3 个答案:

答案 0 :(得分:2)

<% comment = post.comments.order(:created_at).reverse_order.first %>
<%= comment.user.email if comment %>

执行以下操作:

它获得帖子的所有评论,由created_at字段以相反顺序排序(即顶部的最大值)。从那里,它选择第一个值,即最新的评论。然后,根据该评论,您将获得user

设置顺序是非可选的,因为如果没有明确指定,数据库可以按任意顺序自由返回元素。由于存储记录的方式,您将在Postgres或Oracle上比在MySQL或SQLite上更频繁地观察随机顺序。但是,如果未指定订单,所有这些订单将至少偶尔返回随机元素订单。

答案 1 :(得分:1)

<% @posts.each do |post| %>
  ...

  <%= post.comments.last.user.email %>
<% end %>

答案 2 :(得分:1)

之前的回答仅适用于您的帖子有一些评论。如果没有评论,那么您将收到错误,正如您所指出的那样。

您可以通过在尝试输出之前测试评论来解决此问题:

<% @posts.each do |post| %>
  ...

  <% if post.comments.empty? %>
    Nobody has commented yet
  <% else %>
    <%= post.comments.last.user.email %>
  <% end %>
<% end %>