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中找到了这个解决方案
假设您的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_project该where子句指示之前的所有项目@project,order首先将它们列为最新(将其放在@project最前面的那个)并将first查询限制为一个结果,即前一个项目.查询@next_project是相同的,但相反.如果publish不是唯一的,你也必须对第二个标准进行排序.
但是,你可能想要考虑不重新发明轮子并使用非常常见的gem acts_as_list,这会使它像@project.higher_item和一样简单@project.lower_item.
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |