2013-09-21 32 views
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 

因此,每个方法调用三个数据库查询,我已经学会了保持数据库查询到最低限度,所以我不知道是否有一种方法做得到这样的结果只有一个查询。

回答

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 

您可以根据需要挑选方法。

+0

编辑 - 谢谢,实际上很有帮助,看到你在行动。 :-) – Maarten

+0

等等,我在想它:)以前应该没问题吧。 –

+0

但是如何: \ *删除的项目,将导致ID范围内的差距 \ *包装。 'Item.last.next'将返回'nil',但应返回'Item.first'。 – Maarten

相关问题