当公司has_many用户和我想在同一页面上显示我的所有公司和用户时,改善页面加载

时间:2014-07-04 07:38:26

标签: ruby-on-rails optimization

我有两个模型,CompanyUserCompany有许多Users

在我的一个页面上,我想在一个页面上显示我的所有公司和用户:

<% @companies.each do |c| %>
  <%= c.name %>
  <% c.users.each do |u| %>
     <%= u.name %>
  <% end %>
<% end %>

唯一的问题是该页面开始需要最少15-30秒才能加载,因为我有很多公司和用户连接到公司。我当前的解决方案需要O(n^2)(如果我错了,请纠正我),所以这个解决方案只会随着我的样本增长而变得更糟。

有提高性能的好方法吗?每天都有新用户被添加到公司,因此我考虑使用公司ID作为密钥和一组用户作为值来缓存哈希。这是一个可行的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您想使用急切加载

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

简而言之,如果您在控制器中执行类似Company.includes(:users).find(2)的操作,它将执行两个查询 - 一个用于加载公司,另一个用于同时加载所有用户。然后,您可以安全地迭代视图中的用户,而不会产生任何额外的性能开销。

如果您有公司关系,例如,这也有效。 Company.includes(:users).where(active: true)。它将在两个查询中加载所有活跃的公司以及所有公司的所有用户。