0

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

该模型有一个 id 字段,它是一个序列值,它被设置为键。

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

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

4

2 回答 2

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 即可到达正确的 url。

“(或第一条记录)”部分用于在您处于末尾时移动到第一条记录(即当前一条之后没有记录)。

编辑 :

  # 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 *”。

于 2013-03-13T17:11:36.713 回答
1
current = Model.get id
next = Model.all(:id.gt => current.id, :order => [:id.asc]).first

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

于 2013-03-14T20:05:47.403 回答