2

我有一个用户模型,其中

default_scope :order => 'created at desc'

我目前有 50 条记录,ID 为 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

4

3 回答 3

3

这是一个常见的错误。User.last(1)并且User.last()不完全相同。User.last(1)会给你一个单条记录的数组,同时User.last()返回那个记录对象。

default_scope同样,如果您的 User 模型中有一个,这两种方法的行为将完全不同。

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

因此,您在这里真正需要做的是使用 Kien 提到的删除User.unscoped默认范围。就个人而言,我避免使用默认范围排序,而是使用显式范围。

于 2012-12-02T07:05:59.410 回答
1

Rubydocs为您提供有关 first 和 last 方法的信息。

如果你 last(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)

你可以传递很多参数来得到你想要的。

于 2012-12-01T16:48:06.653 回答
1

尝试unscoped方法:

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

您可以检查Remove all scoping

于 2012-12-02T02:20:53.913 回答