为什么User.last(2)和User.first(2)返回相同的用户?

时间:2012-12-01 14:20:05

标签: ruby-on-rails activerecord

我有一个用户模型

default_scope :order => 'created at desc'

我目前有50条记录,ids 1到50。

User.first返回User id: 50

User.first(2)返回User id: 50User id: 49

User.last返回User id: 1

这一切都有道理。然而,

User.last(2)按此顺序返回User id: 49User id: 50。这是为什么?我如何返回User id: 1User id: 2

3 个答案:

答案 0 :(得分:3)

这是一个常见的错误。 User.last(1)User.last()并不完全相同。 User.last(1)将为您提供单个记录的数组,而User.last()将返回该记录对象。

同样,如果您的用户模型中有default_scope,这两种方法的行为会完全不同。

User.last只适用于您的默认范围,撤消其订单。所以它触发的SQL查询是:

SELECT * FROM users ORDER BY created_at ASC LIMIT 1

另一方面,User.last(1)类似于撰写User.order('id desc').limit(1)。使用default_scope后,order by id desc将成为默认值的第二位。所以它触发的SQL将是:

SELECT * FROM users ORDER BY created_at desc, id desc LIMIT 1

所以你真正需要做的是使用User.unscoped删除默认范围,如Kien所述。 就个人而言,我避免使用默认范围排序,而是使用显式范围。

答案 1 :(得分:1)

Rubydocs为您提供有关第一种和最后一种方法的信息。

如果您上次(2)无效,可以尝试

User.find(:order => 'created_at asc', :limit =>2)

校正

User.find(:all,:order => 'created_at asc', :limit =>2)  
User.unscoped.order('created_at asc').limit(2)

你可以传递许多参数来获得你想要的东西。

答案 2 :(得分:1)

尝试unscoped方法:

User.unscoped.first(2) # Get User id=1 and id=2

您可以查看Remove all scoping