我试图通过一个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
找到了这个解决方案
答案 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_project
,where
子句指示@project
之前的所有项目,order
首先列出最新项目(将@project
放在first
之前top)和@next_project
将查询限制为一个结果,即之前的Project。 publish
的查询是相同的但是相反。如果@project.higher_item
不是唯一的,那么你也必须对第二个标准进行排序。
但是,你可能想要考虑不重新发明轮子并使用非常常见的宝石acts_as_list,这会使它变得像@project.lower_item
和{{1}}一样简单。