2013-01-21 37 views
1

我使用ruby 1.9.3和ruby-datamapper與postgresql。我有一張滿桌的桌子,每桌有三個屬性:id,textcreated_at。最後一個是Date對象。如何獲取ruby DataMapper :: Collection的所有不同屬性值?

在我的應用程序I SELECT一些條目像這樣:collection = Entry.all(:text => /SomeRegexp/)。我現在想知道發生在返回的DataMapper::Collection中的所有不同的created_at。我想到了以下兩種方法:

  1. 遍歷DataMapper::Collection並收集所有日期。

    dates = Array.new 
    Entry.all(:text => /SomeRegexp/).each { |entry| dates.include?(entry.date) ? next : dates = dates << entry.date } 
    

    優點:

    • 它應該工作

    缺點:

    • 它是巨大的緩慢數據的坐騎
  2. 請求數據庫每天的條目,並收集日期,其中collection =零

    dates = Array.new 
    for date in DatabaseStartDate..Date.today 
        Entry.all(:created_at => date, :text => /SomeRegexp/).empty? ? next : dates = dates << date) 
    end 
    

    優點:

    • 應該比快上面的例子,尤其是對於大量數據

    缺點:

    • 許多數據庫查詢

注意:上面的代碼是未經測試的僞代碼,它應該只是給讀者一個粗略的想法真正的代碼應該做什麼,所以它不太可能工作。如果您需要更詳細的示例隨時發表評論,我會嘗試更好地解釋它!

下一條通知:如果您在僞代碼中發現錯誤,請告訴我,以便我可以更快開始! ;)

所以最後我的問題是:我應該更喜歡哪種解決方案或有更好的一個沒有進入我的腦海?

回答

0

OK,我做了一些測試,下面是我的結果:

溶液#1,快一點的少量數據,但對於> 10_000記錄第二個解決方案顯然更快。

僅選擇需要的元素就可以提高兩種解決方案的性能。 Entry.all(:text => /SomeRegexp/, :fields => [:id, :date])

這兩個代碼片段都適合我。

如果你知道一個更好的解決方案(可能是內置到datamapper甚至postgresql的東西),請回答這個問題! ;)

相關問題