我有一个用户模型
default_scope :order => 'created at desc'
我目前有50条记录,ids 1到50。
User.first
返回User id: 50
。
User.first(2)
返回User id: 50
和User id: 49
User.last
返回User id: 1
这一切都有道理。然而,
User.last(2)
按此顺序返回User id: 49
和User id: 50
。这是为什么?我如何返回User id: 1
和User id: 2
?
答案 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)