Rails:获取下一个/上一个记录

And*_*rew 48 sql ruby-on-rails ruby-on-rails-3

我的应用拥有属于用户的照片.

在照片#show视图中,我想显示"来自此用户的更多内容",并显示该用户的下一张和上一张照片.我会很好,这些是id顺序的下一张/上一张照片或下一张/上一张照片created_at.

您如何为下一张/上一张照片或多张下一张/上一张照片撰写此类查询?

Har*_*tty 93

试试这个:

class User
  has_many :photos
end


class Photo
  belongs_to :user

  def next
    user.photos.where("id > ?", id).first
  end

  def prev
    user.photos.where("id < ?", id).last
  end

end
Run Code Online (Sandbox Code Playgroud)

现在你可以:

photo.next
photo.prev
Run Code Online (Sandbox Code Playgroud)

  • @igrek我已经修复了答案.一般来说,我避免使用`last`调用,因为如果你有一个大数据集它会影响性能(http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-查询降).我使用`ORDER BY id DESC`子句来获取最后一行. (3认同)

Cre*_*emz 18

它也引导我解决我的问题.我试图为一个项目制作下一个/上一个,没有涉及任何关联.最后在我的模型中做了类似的事情:

  def next
    Item.where("id > ?", id).order("id ASC").first || Item.first
  end

  def previous
    Item.where("id < ?", id).order("id DESC").first || Item.last
  end
Run Code Online (Sandbox Code Playgroud)

这样它就会循环,从最后一个项目到第一个项目,反之亦然.我之后只是打电话给@item.next我的意见.


jwi*_*x09 8

不确定这是否是Rails 3.2+中的更改,而不是:

model.where("id < ?", id).first
Run Code Online (Sandbox Code Playgroud)

为了以前.你必须做

.where("id > ?", id).last
Run Code Online (Sandbox Code Playgroud)

似乎"order by"是错误的,所以首先给你DB中的第一条记录,因为如果你有3项低于当前的[1,3,4],那么"first"就是1,但是最后一个是你正在寻找的那个.您也可以在where之后应用排序,但这是一个额外的步骤.