我有一个用户和相关用户的关系表。
如果我这样做,@user.related_users
我会得到一个指向用户的 user_id 列表。
在我看来,我想列出他们的名字
<% current_user.related_users.each do |u| %>
<%= User.find(u).name %>
<% end %>
我担心它可能会使数据库过载太多,因为每次有人访问该视图时它都会从数据库中获取每个相关用户。
有没有更好的方法来做到这一点?或者就是这样,我无能为力?
我有一个用户和相关用户的关系表。
如果我这样做,@user.related_users
我会得到一个指向用户的 user_id 列表。
在我看来,我想列出他们的名字
<% current_user.related_users.each do |u| %>
<%= User.find(u).name %>
<% end %>
我担心它可能会使数据库过载太多,因为每次有人访问该视图时它都会从数据库中获取每个相关用户。
有没有更好的方法来做到这一点?或者就是这样,我无能为力?
这就是急切加载的目的。理想情况下,在您的模型中,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 (...)
子句的单个查询获取所有相关用户。