2

我正在尝试通过 slug 查找模型的 1 个实例,我可以通过

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

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

我将如何仅按列获取任意顺序的前一个和下一个实例的 slug?

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

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找到了这个解决方案

4

1 回答 1

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子句表示之前的所有项目@projectorder将它们列出在最前面(将之前的一个放在@project顶部)并将first查询限制为一个结果,即上一个项目。查询@next_project相同但相反。如果publish不是唯一的,您还必须对第二个标准进行排序。

但是,您可能需要考虑不重新发明轮子并使用非常常见的 gem act_as_list,这将使这变得像@project.higher_itemand一样简单@project.lower_item

于 2012-05-23T03:58:42.710 回答