Rails:获取下一个/上一个logging

我的应用有属于用户的照片。

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

你将如何为下一张/上一张照片或多张下一张/上一张照片编写这种查询?

尝试这个:

 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 

现在你可以:

 photo.next photo.prev 

这也导致我解决我的问题。 我试图做一个项目的下一个/ prev,没有涉及的协会。 最终在我的模型中做了这样的事情:

  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 

这样它循环,从最后一个项目到第一个和其他方式。 之后我只是在我的视图中调用@item.next

不知道这是Rails 3.2+的变化,而不是:

 model.where("id < ?", id).first 

为以前。 你必须做

 .where("id > ?", id).last 

看来“order by”是错误的,所以首先给你DB中的第一个logging,因为如果你有三项低于当前的[1,3,4],那么“first”是1,但是最后一个是你正在寻找的东西。 你也可以在那里应用一种sorting,但这是一个额外的步骤。

 class Photo < ActiveRecord::Base belongs_to :user scope :next, lambda {|id| where("id > ?",id).order("id ASC") } # this is the default ordering for AR scope :previous, lambda {|id| where("id < ?",id).order("id DESC") } def next user.photos.next(self.id).first end def previous user.photos.previous(self.id).first end end 

然后你可以:

 photo.previous photo.next 

您可以将某些选项传递给where方法:

对于下一张照片:

 Photo.where(:user_id => current_user.id, :created_at > current_photo.created_at).order("created_at").first 

上一张照片

 Photo.where(:user_id => current_user.id, :created_at < current_photo.created_at).order("created_at").last 

我可能会有第一个/最后一个混淆。

你可能想检查Nexter 。 它可以在任何dynamic创build的范围内工作,而不依赖于模型中的一个硬编码。

 class Photo < ActiveRecord::Base belongs_to :user default_scope { order('published_at DESC, id DESC') } def next current = nil user.photos.where('published_at >= ?', published_at).each do |p| if p.id == id then break else current = p end end return current end def previous current = nil user.photos.where('published_at <= ?', published_at).reverse.each do |p| if p.id == id then break else current = p end end return current end end 

我发现这里的答案并不适合我的情况。 想象一下,你想要一个前一个或下一个发布的date,但一些照片发布在同一天。 这个版本将按照它们在页面上呈现的顺序循环显示照片,并在集合中的当前照片之前和之后。