我的实践控制器索引方法中有以下代码:
@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
答案 0 :(得分:1)
看起来您正确地返回有限的集合并将其存储在@practices
实例变量中。
但是,您使用@activity.practices
渲染部分,这将触发整个无限制实践集合的延迟加载,因为该集合尚未加载到@activity
对象上。
答案
<%= render @practices %>
应该有用。
奖金回合
最后,如果您想要一些更“面向对象”的东西,您可以将“有限”查询放入名为“recent_practices”的范围中,以便您可以调用:
<%= render :partial => 'practices', :object => @activity.recent_practices %>
上面的例子将在partial中使用名为'recent_practices'的局部变量,而不是实例变量。
有关ActiveRecord scopes here的更多信息。