我有一个使用datamapper进行数据库处理的Sinatra应用程序。该应用程序的工作原理是为表格中的每个ID显示一个单独的页面。
模型有一个id字段,它是一个串行值,它被设置为键。
目前,我使用从当前ID添加或减去1的链接在记录之间浏览。这不太理想,因为一旦我删除了中间的记录,它就会中断。
我可以使用Datamapper中的.next方法或其他方法来使其工作吗?
答案 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大于当前对象的第一个对象。