rails按字母顺序查找上一个和下一个记录

时间:2015-02-20 20:10:26

标签: ruby-on-rails ruby

在用户显示屏幕上,我需要将链接放到上一个和下一个用户,链接将我带到帐户内按姓氏按字母顺序排列的下一个或上一个用户。

我应该解释一下......

我们的用户按帐户分组,每个用户都有一个account_id。当有人登录他们的帐户并查看用户时,他们需要能够单击按钮并转到按用户字段排序的下一个用户,last_name

所以我用

在视图上显示它
= @user.next_employee.last_name.upcase

然后我转到员工模型并将占位符放在适当的位置,如

def next_user
  User.find(100)
end

这就是一切都搞定了,但是我显然需要将实例方法变成有用的东西。所以我做了一些研究,发现了......

  def next_user
    self.class.first(:conditions => ["last_name > ?", last_name], :order => "last_name desc")
  end

从我有限的理解,这似乎做了我想要的除了通过帐户限制它的例外。但是,当我的测试用户的姓氏为" Roberts"返回的记录的last_name为" wong",这表明它在数据库中通过last_name降序获得了它找到的第一条记录,我不明白。

更奇怪的是,当我查看控制台时,当时正在运行的SQL是

SELECT `users`.* FROM `users` WHERE (users.deleted_at IS NULL) AND (last_name > 'Richards') ORDER BY first_name, last_name asc LIMIT 1

不确定" first_name"事情正在蔓延......

编辑:那就是

default_scope order(:first_name)

用户模型。

我哪里错了。

EDIT2:向所有读者道歉。我已经破解了它。

只需要添加" unscoped"确保忽略默认范围。现在,以下代码有效。

  def next_user
    self.class.unscoped.first(:conditions => ["last_name > ?", last_name], :order => "last_name desc")
  end

最后阶段是弄清楚如何将其限制在特定帐户。我很担心将account_id作为参数传递,因为有人可能只是在页面上更改此内容并传入另一个account_id,并且模型中没有current_account。

这最终有效......

User.unscoped.where(:account_id => self.account_id).first(:conditions => ["last_name > ?", last_name], :order => "last_name asc").account_id

现在我只需要为第一个和最后一个记录和工作完成整理。对不起打扰你们所有人!

1 个答案:

答案 0 :(得分:0)

你自己发现了它。您需要删除您提供的default_scope。您可以通过使用unscoped

取消模型来实现此目的

self.class.unscoped.where('last_name > ?', last_name).order('last_name DESC')