Datamapper - 模型中的下一条记录

时间:2013-03-13 10:39:36

标签: ruby sinatra datamapper

我有一个使用datamapper进行数据库处理的Sinatra应用程序。该应用程序的工作原理是为表格中的每个ID显示一个单独的页面。

模型有一个id字段,它是一个串行值,它被设置为键。

目前,我使用从当前ID添加或减去1的链接在记录之间浏览。这不太理想,因为一旦我删除了中间的记录,它就会中断。

我可以使用Datamapper中的.next方法或其他方法来使其工作吗?

2 个答案:

答案 0 :(得分:2)

您可以搜索下一个和上一个ID,并使用它们来构建链接 (而不是使用您当前的ID +或 - 1)。

# Record/123 : display a record
get '/record/:id' do

  # Get record belonging to id
  @record = Record.first({id: params[:id]})

  # Get id for next record
  next = Record.first({:fields => [:id],
                       :order => :id.asc,
                       :id.gt => @record.id})
  # (or the first record)
  next = Record.first({:fields => [:id],
                       :order => :id.asc}) unless next
  @next_id = next[:id]

  # Get id for previous record
  prev = Record.last({:fields => [:id],
                      :order => :id.asc,
                      :id.lt => @record.id})
  # (or the last record)
  prev = Record.last({:fields => [:id],
                      :order => :id.asc}) unless prev
  @prev_id = prev[:id]

  # Display the record
  erb :record

end

然后你只需要在视图中使用@next_id和@prev_id来达到 正确的网址。

“(或第一个记录)”部分用于移动到第一个记录时 你到最后(即当前没有记录)。

修改:

  # Get id for next record
  next = Record.first({:fields => [:id],
                       :order => :id.asc,
                       :id.gt => @record.id})

我们需要在表格中的当前ID之后找到下一个ID。使用SQL,它是:

   SELECT Id                  # :fields => [:id]
   FROM   Records 
   WHERE  Id > Current_Id     # :id.gt => @record.id
   ORDER BY Id ASC            # :order => :id.asc

如果没有“:fields => [:id]”,当我们只需要ID时,我们会有一个“SELECT *”。

答案 1 :(得分:1)

current = Model.get id
next = Model.all(:id.gt => current.id, :order => [:id.asc]).first

它抓取id大于当前对象的第一个对象。