0

Rails 4 アプリで、データベース内の (n 番目の) 次または前の行を取得する関数をモデルに定義し、データベース全体をラップして、以下Item.last.nextを参照しItem.firstます。

  def next(n=0)
    following = Item.where("id > ?", self.id).order("id asc") + Item.where("id < ?", self.id).order("id asc")
    following[n % following.length]
  end

  def prev(n=0)
    n = n % Item.count-1
    previous = Item.where("id < ?", self.id).order("id desc") + Item.where("id > ?", self.id).order("id desc")
    previous[n % previous.length]
  end

これにより、メソッド呼び出しごとに 3 つのデータベース クエリが発生します。データベース クエリを最小限に抑えることを学んだので、1 つのクエリだけでこの結果を取得する方法があるかどうか疑問に思います。

4

1 に答える 1

1

あなたが探しているものは、少し高いレベルのようです。では、まずは基本的なAPIを用意しましょう。

def next(n=1)      
  self.class.where('id > ?', id).limit(n).order('id ASC')
end

def previous(n=1)
  self.class.where('id > ?', id).limit(n).order('id DESC')
end

次に、より高いレベルのメソッド

def next_recycle(n=1)
  klass = self.class
  return klass.first if (n = 1 && self == klass.last)
  next(n)
end

def previous_recycle(n=1)
  klass = self.class
  return klass.last if (n == 1 && self == klass.first)
  previous(n)
end

必要に応じて方法を選択できます。

于 2013-09-21T12:18:32.370 に答える