Lowgain,听起来不像你,但只是为了确保 - 你实际上并没有使用名为scope的 named_scope 进行测试,对吧?因为范围是一个现有的方法,并且使用它作为你的范围名称会导致错误(和无限循环)。
编辑:
您的 named_scope 是否恰好包含 :limit 子句?我刚开始遇到类似的问题。我有一个属于用户的模型响应,其命名范围如下:
named_scope :top, lambda { |limit| {
:limit => limit,
:order => 'total_score DESC' }}
我在控制台中看到了这样的结果:
?> u = User.find 1
?> u.responses.length
=> 9
?> u.responses.paginate(:page => 1, :per_page => 5).length
=> 5
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).paginate(:page => 1, :per_page => 5).length
=> 5
哎呀!我的前 3 名如何分页以生成超过 3 行?根据您的示例,我尝试了您的 find(:all) 技巧,结果相似:
?> u.responses.top(3).find(:all).paginate(:page => 1, :per_page => 5).length
=> 3
这看起来像是 named_scope 中的一个错误,因为我可以将 will_paginate 排除在外,并引发类似的混乱:
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).size
=> 9 <-- .size produces wrong answer
?> r = u.responses.top(3)
?> r.size
=> 3 <-- correct when result assigned to var
到目前为止,这似乎只在我使用 MySQL 时发生。我想我在 StackOverflow 上阅读了另一篇文章,其中有人在使用 .size 与 AR 结果和 MySQL 时遇到了类似的问题,解决方案是始终在他们的 AR 结果上使用 .length。我曾尝试修改 will_paginate 以用 .length 替换所有 .size 实例,但可惜并不是那么简单,但我怀疑这个或类似的问题会以某种方式影响 will_paginate。
目前,我正在使用您的 find(:all) 技巧来解决这个问题。