我有一个发布模型:
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和各种论坛中看到)?
答案 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 %>