我有两个模型,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作为键,以用户数组作为值。这是一个可行的解决方案吗?
你想使用即时加载
http://guides.rubyonrails.org/active_record_querying.html eager-loading-associations
简而言之,如果您在控制器中执行Company.includes(:users).find(2)
之类的操作,它将执行两个查询—一个用于加载公司,另一个用于同时加载所有用户。然后,您可以安全地遍历视图中的用户,而不会产生任何额外的性能开销。
这也适用于有公司关系的情况。Company.includes(:users).where(active: true)
。它将在两个查询中加载所有活动公司和所有公司的所有用户。