У меня есть области действия, определенные в модуле включения, например:
module ActsAsAdjacent
def self.included(base)
base.send(:scope, :next, lambda {|id| {:conditions => ["id > ?",id],
:order => "id ASC", :limit => 1}})
base.send(:scope, :previous, lambda {|id| {:conditions => ["id < ?",id],
:order => "id DESC", :limit => 1}})
end
, идея в том, что вы можете смешать следующую, предыдущую возможность с любым подклассом ActiveRecord :: Base.(Выше приведен вариант некоторых примеров, плавающих вокруг).
Очевидный недостаток вышесказанного заключается в том, что он принимает определенный столбец 'id', тогда как в некоторых случаях этот столбец может не существовать,или может использоваться другой порядок сортировки.
Есть ли способ сделать следующий, предыдущий, основанный на текущем порядке сортировки, или как записи располагаются в БД.
Так, например, в следующем случае,
class User < ActiveRecord::Base
default_scope :order => 'users.name ASC'
include ActsAsAdjacent
ActsAsAdjacent будет автоматически использовать этот порядок сортировки для возврата к следующему, предыдущему.
Я думаю, id всегда будет существовать, ноэто не может быть отсортировано по этому.