我有两个模型,Company
和User
。 Company
有许多Users
。
在我的一个页面上,我想在一个页面上显示我的所有公司和用户:
<% @companies.each do |c| %>
<%= c.name %>
<% c.users.each do |u| %>
<%= u.name %>
<% end %>
<% end %>
唯一的问题是该页面开始需要最少15-30秒才能加载,因为我有很多公司和用户连接到公司。我当前的解决方案需要O(n^2)
(如果我错了,请纠正我),所以这个解决方案只会随着我的样本增长而变得更糟。
有提高性能的好方法吗?每天都有新用户被添加到公司,因此我考虑使用公司ID作为密钥和一组用户作为值来缓存哈希。这是一个可行的解决方案吗?
答案 0 :(得分:1)
您想使用急切加载。
http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
简而言之,如果您在控制器中执行类似Company.includes(:users).find(2)
的操作,它将执行两个查询 - 一个用于加载公司,另一个用于同时加载所有用户。然后,您可以安全地迭代视图中的用户,而不会产生任何额外的性能开销。
如果您有公司关系,例如,这也有效。 Company.includes(:users).where(active: true)
。它将在两个查询中加载所有活跃的公司以及所有公司的所有用户。