0

我的方式

控制器模式 1 (注意:这里,它正在调用所有用户!!)

@users = User.confirmed.joins(:profile)

查看模式 1 (注意:这里只显示前 10 个用户,但显示所有用户的数量!!)

<%= "ALL ("+ @users.count.to_s + " users)" %>

<% @users.limit(10).each do |users| %>
    <%= render 'users/user', :user => users %>
<% end %>

如果我正在考虑页面加载速度,是否应该像下面这样?还是不会改?

控制器模式 2 (注意:我添加了limit(10), 并@users_count计算所有用户)

@users = User.confirmed.joins(:profile).limit(10)
@users_count = User.confirmed.joins(:profile).count

查看模式 2 (注意:我将其取下limit(10)@users_count用于计数)

<%= "ALL ("+ @users_count.to_s + " users)" %>

<% @users.each do |users| %>
    <%= render 'users/user', :user => users %>
<% end %>
4

3 回答 3

2

如果您禁用了延迟加载,那么第二种方法会更快,因为 Rails 不需要从数据库中获取所有记录。在执行查询时,您真的应该只获取您需要的记录。

如果你开启了延迟加载(默认),那么也是一样的,因为数据是在需要的时候去取的,所以效果是一样的。您还可以将两个变量放在控制器中并编写与视图中相同的查询,并且仅在需要时才获取数据。

@users = User.confirmed.joins(:profile)
@users_count = @users.count
@users = @users.limit(10)

您可以在 Rails 控制台中检查应用程序生成的 sql,然后再决定。

此外,如果您在 user.html.erb 中使用配置文件,请考虑使用包含而不是加入。如果需要关联记录,加入可能会导致 n+1 问题。如果你不这样做,你就不想获取你不需要的记录。你可以在这里阅读更多关于它的信息,在 12 Eager Loading Associations 中。

于 2013-06-12T10:21:05.427 回答
1

你可以试试@users.find_in_batches

请看 分批查找

请告诉我

如果你想快速加载

我可以建议你memcache Memcache

于 2013-06-12T09:54:24.797 回答
1

这两个选项完全相同。他们都没有加载所有的Users 因为你只是链接范围。只有当您在视图中调用 .each 时才会运行查询,此时您已经应用.limit(10)了。我会选择第一个选项,因为代码更干净。

@users.count执行一次查询以获取计数,它不实例化任何User对象。 @users.limit(10).each ...执行一个查询(实际上是两个,因为您已经使用过includes),因此它将实例化 10 个对象以及您的包含。

于 2013-06-12T10:16:24.093 回答