2012-05-23 63 views
2

我試圖通過鼻涕蟲,我可以通過RoR |如何找到下一個,並根據日期以前

@project = Project.where(:slug => params[:id]).first 

做但是,一旦我得到了比如我想查找一個模型的1個實例從名爲publish的列的順序查找模型的下一個和前一個實例,這是一個日期。

我怎樣才能得到我的任意訂單的列的前一個和下一個實例的slu??

::編輯:: 添加到我的模擬工作。

def previous(offset = 0)  
    self.class.select('slug').first(:conditions => ['published < ?', self.id], :limit => 1,  :offset => offset, :order => "published DESC") 
end 

def next(offset = 0) 
    self.class.select('slug').first(:conditions => ['published > ?', self.id], :limit => 1, :offset => offset, :order => "published ASC") 
end 

我發現在Next, Previous Records Using Named Scope

+0

你需要什麼?下一個和上一個或下一個和上一個? – Mischa

+0

對不起米莎我可能會混淆問題。我正在尋找與最初查詢的關係中的下一個和前一個實例。初始實例不知道它與其他實例的關係。該訂單基於稱爲發佈日期的模型中的一列。 –

回答

8

該解決方案假設您publish日期是唯一這樣的事情應該工作:

@project = Project.where(:slug => params[:id]).first 

@prev_project = Project.where("publish < ?", @project.publish). 
         order("publish DESC"). 
         first 

@next_project = Project.where("publish > ?", @project.publish). 
         order("publish"). 
         first 

對於@prev_projectwhere子句表示@project之前的所有項目,order列出他們最新的第一個(將@project之前的那個放在頂部)和first將查詢限制爲一個結果,即前一個項目。 @next_project的查詢是相同的,但相反。如果publish不是唯一的,那麼你也必須在第二個標準中進行排序。

但是,您可能需要考慮不重新發明輪子並使用非常常見的寶石acts_as_list,這會使其簡化爲@project.higher_item@project.lower_item

相關問題