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 に答える