RoR |如何根据日期查找下一个和上一个

时间:2012-05-23 03:47:40

标签: ruby-on-rails ruby activerecord

我试图通过一个slug查找一个模型的实例,我可以通过

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

但是一旦我得到实例,我想从名为publish的列的顺序中找到模型的下一个和前一个实例,这是一个日期。

我怎样才能获得我的任意顺序的上一个和下一个实例的slug?

::编辑::  将此添加到我建模的工作中。

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

找到了这个解决方案

1 个答案:

答案 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之前top)和@next_project将查询限制为一个结果,即之前的Project。 publish的查询是相同的但是相反。如果@project.higher_item不是唯一的,那么你也必须对第二个标准进行排序。

但是,你可能想要考虑不重新发明轮子并使用非常常见的宝石acts_as_list,这会使它变得像@project.lower_item和{{1}}一样简单。