限制在Rails3中没有按预期工作

时间:2011-01-23 22:06:31

标签: ruby-on-rails-3 limit

我的实践控制器索引方法中有以下代码:

@practices = @activity.practices.order('created_at DESC').limit(20)

不幸的是,限制调用无效,而@practices返回> 20个对象。我确信这是一个很容易解决的问题,但我不确定我做错了什么。我似乎按照文档中规定的方式使用这种方法..

我尝试在订单调用之前将限制调用置于限制之内,结果相同。

更新

SQL LOG:

Practice Load (1.6ms)  SELECT "practices".* FROM "practices" WHERE ("practices".activity_id = 9) ORDER BY practiced_on DESC, created_at DESC LIMIT 20

然而,在日志的下方,我发现了这个:

   Rendered practices/_practice.html.erb (216.9ms)
  Activity Load (0.6ms)  SELECT "activities".* FROM "activities" WHERE ("activities".user_id = 1)
  Practice Load (0.8ms)  SELECT "practices".* FROM "practices" WHERE ("practices".activity_id = 8) ORDER BY practiced_on DESC
  CACHE (0.0ms)  SELECT "practices".* FROM "practices" WHERE ("practices".activity_id = 9) ORDER BY practiced_on DESC

这让我觉得部分不接受正确的收藏。部分称为:

<%= render @activity.practices %>

有什么建议吗?

TIA

1 个答案:

答案 0 :(得分:1)

看起来您正确地返回有限的集合并将其存储在@practices实例变量中。

但是,您使用@activity.practices渲染部分,这将触发整个无限制实践集合的延迟加载,因为该集合尚未加载到@activity对象上。

答案

<%= render @practices %>应该有用。

奖金回合

最后,如果您想要一些更“面向对象”的东西,您可以将“有限”查询放入名为“recent_practices”的范围中,以便您可以调用:

<%= render :partial => 'practices', :object => @activity.recent_practices %>

上面的例子将在partial中使用名为'recent_practices'的局部变量,而不是实例变量。

有关ActiveRecord scopes here的更多信息。