を参照することなく、ActiveRecordの中の前:アイデアはあなたが任意のActiveRecordの::基本サブクラスに、次の以前の機能をミックスインできるということで、、私はスコープは、このような含めるモジュールで定義されている列
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
。 (上記は、周囲に浮かぶいくつかの例の変形です)。
明らかなのは、特定の列 'id'を想定していますが、その列が存在しない場合や、使用されているソート順が異なる場合があることです。
現在のソート順が何であっても、またはdb内でレコードがどのようにレイアウトされているかに基づいて、次に行う方法はありますか?したがって、次の場合は例えば
、
class User < ActiveRecord::Base
default_scope :order => 'users.name ASC'
include ActsAsAdjacent
ActsAsAdjacentが自動的に前の、次返すために、そのソート順を使用します。
私はいつもIDは存在すると思いますが、それはソートされていない可能性があります。
実際には、次のスコープはそのdefault_scopeのidには機能しません。この場合、常に最初の名前のレコードがアルファベット順に返されます。それを理解できません。 – Mark
Your:nextと:previousメソッドはスコープではありません。それらは単一のメソッドを返すだけなので、実スコープのようなクラスではなく、インスタンスで呼び出される必要があります。 – noodl