0

我有一个用户和相关用户的关系表。

如果我这样做,@user.related_users我会得到一个指向用户的 user_id 列表。

在我看来,我想列出他们的名字

<% current_user.related_users.each do |u| %>
<%= User.find(u).name %>
<% end %>

我担心它可能会使数据库过载太多,因为每次有人访问该视图时它都会从数据库中获取每个相关用户。

有没有更好的方法来做到这一点?或者就是这样,我无能为力?

4

1 回答 1

2

这就是急切加载的目的。理想情况下,在您的模型中,related_users应该是一个关联:

has_many :related_users # add conditions to find the related users if necessary

然后在您的控制器中,获取@user如下内容:

@user = User.includes(:related_users)

这将只对所有相关用户执行 1 次查询,而不是为每个相关用户执行一次查询(所谓的 1+N 问题)。

或者,如果您不想重写模型代码,只需将所有相关用户加载到控制器中的变量中:

@related_user = User.where(id: current_user.related_users)

并在您的视图中对其进行迭代。这将使用带有WHERE id IN (...)子句的单个查询获取所有相关用户。

于 2012-11-25T12:58:10.550 回答