在我的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
这会导致每个方法调用三个数据库查询,并且我已经学会将数据库查询保持在最低限度,所以我想知道是否有办法仅使用一个查询获得此结果。
答案 0 :(得分: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
您可以根据需要选择方法。