我什至不知道该搜索什么,所以我只解释一下我要做什么。在我的用户索引页面上,我正在打印最新用户的列表以及即时信息(users表中的内容)。那么,该如何处理该用户的最新帖子呢?我不知道该在控制器中做什么,这将使我无法分别访问每个结果。
这是一个简化的视图:
<% @users.each do |user| %>
<%= link_to user.username, user_path(user) %><br />
<%= user.email %>
# this is where I would show the user's latest post
<% end %>
控制器:
def index
@users = User.order('created_at DESC').paginate(:page => params[:page], :per_page => 24)
@user_latest_post = ???
end
答案 0 :(得分:1)
您应该设置User
使其与Post
有关联。这使您可以访问属于该用户的所有帖子(例如user.posts
)。对于您的问题,这不是完全必要的,但可能是您想要的(或已经完成的)。
然后,您需要创建第二个范围界定的关联,以获取最新的Post
。这样,您可以在控制器中使用includes
并避免出现N + 1问题(否则,每次您使用该each
块遍历用户时,它都会对最新帖子进行新查询)。 / p>
最后,您需要选择要显示的关于帖子的内容。按照惯例,您可以为Post创建一个共享的“局部”视图,以供重用。这意味着您只需告诉Rails render user.latest_post
,它就会知道要做什么(假设您已经定义了这一部分)。
我在下面提供一些代码示例来解释我的意思:
# models/user.rb
class User < ApplicationRecord
has_many :posts
has_one :latest_post, class_name: "Post", -> { order(created_at: :desc).limit(1) }
end
# controllers/users_controller.rb
def index
@users = User.includes(:latest_post).order(created_at: :desc).paginate(:page => params[:page], :per_page => 24)
end
# views/users/index.erb
<% @users.each do |user| %>
<%= link_to user.username, user_path(user) %><br />
<%= user.email %>
<%= render user.latest_post %>
<% end %>
# views/posts/_post.erb
<%= post.text %>
# or whatever you want here