0

在我的 Rails 4 应用程序中,我在模型中定义了函数,而不是在 de 数据库中获取 (nth) 下一行或上一行,环绕整个数据库,因此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

这导致每个方法调用产生三个数据库查询,并且我已经学会将数据库查询保持在最低限度,所以我想知道是否有一种方法可以只用一个查询来获得这个结果。

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 回答