следующий, предыдущий в ActiveRecord без ссылки на столбец - PullRequest
0 голосов
/ 16 марта 2012

У меня есть области действия, определенные в модуле включения, например:

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 всегда будет существовать, ноэто не может быть отсортировано по этому.

1 Ответ

1 голос
/ 16 марта 2012

Я думаю, что это неправильное использование. Как насчет этого?

module ActsAsAdjacent
  def next_by(column)
    self.class.where("#{column} > ?", send(column)).order(column).first
  end

  # .. and the obvious inverse for previous_by
end

# Call it like this:
some_user.next_by(:id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...