Я был в подобной ситуации, и в итоге я нашел пару решений, использующих Rails 3.1.3, с методами класса или областью действия (named_scope в Rails 2.x). Этот подход будет работать даже с непоследовательными идентификаторами.
Пример методов класса с использованием модели Post:
def next
Post.where("posts.id > ?", self.id).order("posts.id ASC").limit(1)
end
def previous
Post.where("posts.id < ?", self.id).order("posts.id DESC").limit(1)
end
Это может быть использовано как:
post = Post.find(5)
next_post = post.next
=> [#<Post id: 6, ...]
previous_post = post.previous
=> [#<Post id: 4, ...]
А для областей применения лямбда должна выглядеть примерно так:
scope :next, lambda { |i| {:conditions => ["#{self.table_name}.id > ?", i.id], :order => "#{self.table_name}.id ASC", :limit => 1} }
scope :previous, lambda { |i| {:conditions => ["#{self.table_name}.id < ?", i.id], :order => "#{self.table_name}.id DESC", :limit => 1} }