我有一个使用 datamapper 进行数据库处理的 Sinatra 应用程序。该应用程序通过为表格中的每个 ID 显示单独的页面来工作。
该模型有一个 id 字段,它是一个序列值,它被设置为键。
目前,我使用从当前 ID 加减 1 的链接在记录之间浏览。这不太理想,因为一旦我在中间删除一条记录,它就会中断。
我可以使用 Datamapper 中的 .next 方法或其他方法来完成这项工作吗?
我有一个使用 datamapper 进行数据库处理的 Sinatra 应用程序。该应用程序通过为表格中的每个 ID 显示单独的页面来工作。
该模型有一个 id 字段,它是一个序列值,它被设置为键。
目前,我使用从当前 ID 加减 1 的链接在记录之间浏览。这不太理想,因为一旦我在中间删除一条记录,它就会中断。
我可以使用 Datamapper 中的 .next 方法或其他方法来完成这项工作吗?
您可以搜索下一个和上一个 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 *”。
current = Model.get id
next = Model.all(:id.gt => current.id, :order => [:id.asc]).first
它抓取第一个 id 大于当前对象的对象。