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

Pol*_*her 2 ruby activerecord ruby-on-rails

我试图通过一个slug查找一个模型实例,我可以通过它来完成

@project = Project.where(:slug => params[:id]).first
Run Code Online (Sandbox Code Playgroud)

但是一旦我得到实例,我想从名为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
Run Code Online (Sandbox Code Playgroud)

我在Next,Previous Records Using Named Scope中找到了这个解决方案

Jor*_*ing 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
Run Code Online (Sandbox Code Playgroud)

对于@prev_projectwhere子句指示之前的所有项目@project,order首先将它们列为最新(将其放在@project最前面的那个)并将first查询限制为一个结果,即前一个项目.查询@next_project是相同的,但相反.如果publish不是唯一的,你也必须对第二个标准进行排序.

但是,你可能想要考虑不重新发明轮子并使用非常常见的gem acts_as_list,这会使它像@project.higher_item和一样简单@project.lower_item.