从Rails中的循环结果访问更多对象

时间:2019-07-18 01:48:40

标签: ruby-on-rails

我什至不知道该搜索什么,所以我只解释一下我要做什么。在我的用户索引页面上,我正在打印最新用户的列表以及即时信息(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

1 个答案:

答案 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