2010-09-12 48 views
1

我必須以錯誤的方式完成它:打印出來的記錄失常,即使它們一次插入到一個數據庫中。下面是代碼:Ruby MongoDB-如何根據日期時間對記錄進行排序?

get '/' do 
    db = Mongo::Connection.new("localhost", 27017).db("testdb") 
    @notes = db.collection('notes') 
    @notelist = Set.new() 
    @notes.find().each{|record| @notelist.add(record)} 
    erb :list 
end 

post '/addnote' do 
    db = Mongo::Connection.new("localhost", 27017).db("testdb") 
    col1 = db.collection('notes') 
    col1.insert(
    { 
    "guestname" => "#{params[:post][:guestname]}", 
    "note"  => "#{params[:post][:note]}", 
    "datetime" => Time.now.strftime("%I:%M %p %d-%b-%Y") 
    }) 
redirect '/' 
end 

這裏是ERB模板:

<p><%= @notelist.size() %> notes entered by guests:</p> 
<ul> 
    <% @notelist.each do |record| %> 
    <li><font color='blue'><%= record['guestname'].to_s() + 
    "</font> at <i>" + record['datetime'].to_s() +"</i> wrote: " + 
    record['note'].to_s() %></li> 
    <% end %> 
</ul> 

我試圖讓日期時間的順序所有記錄了DB的,我怎麼能做到這一點?

非常感謝。

更新的信息:

關於第二個想法,我改變數據類型,從時間到UNIX時代,所以它們排序會更好,更容易。

回答

5

這裏的幾個注意事項:

您可以通過添加一種獲得訂單記錄:

@notes.find({}, :sort => 'datetime') 

你不需要輸入您的模板之前進行迭代。 'find'方法返回一個遊標,它本身是可迭代的。所以

@notelist = Set.new() 
@notes.find().each{|record| @notelist.add(record)} 

應改爲

@notelist = @notes.find({}, :sort => 'datetime') 

這是非常低效的,建立在每個請求一個新的連接。你應該在一個配置塊上建立連接,並在那裏緩存數據庫:

configure do 
    DB = Mongo::Connection.new.db("testdb") 
end 

然後在你的請求中使用對DB的引用。

+0

哇,我認爲這實際上超出了我的預期,感謝您的幫助! – 2010-09-12 22:32:04

+0

我完成了所有其他任務,但我仍然不確定如何使用配置塊?任何暗示? – 2010-09-13 12:11:05

+1

當然。看看這個簡單的Sinatra應用程序:http://github.com/banker/mongulator/blob/master/mongulator.rb – 2010-09-13 15:40:51

相關問題