2013-09-21 30 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

相關問題