1

ruby 1.9.3と ruby​​-datamapper を使用していpostgresqlます。エントリでいっぱいのテーブルがあり、それぞれに と の 3 つのプロパティがidありtextますcreated_at。最後はDateオブジェクトです。

私のアプリケーションでは、SELECT次のようなエントリがいくつかありますcollection = Entry.all(:text => /SomeRegexp/)。返された で発生するのすべての異なる値を知りたいと思います。以下の2つの方法を考えました。created_atDataMapper::Collection

  1. を繰り返し、DataMapper::Collectionすべての日付を収集します。

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

    長所:

    • それはうまくいくはずです

    短所:

    • 大量のデータの場合は遅い
  2. データベースに毎日のエントリを要求し、collection != nil の日付を収集します。

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

    長所:

    • 特に大量のデータでは、上記の例よりも高速である必要があります

    短所:

    • 多くのデータベース クエリ

注意: 上記のコードはテストされていない疑似コードです。実際のコードが何をすべきかについて読者に大まかなアイデアを提供するだけなので、動作する可能性は低いです。より詳細な例が必要な場合は、お気軽にコメントしてください。

次の通知: 疑似コードにエラーが見つかった場合はお知らせください。より迅速に作業を開始できます。;)

最後に私の質問は次のとおりです。

4

2 に答える 2

1

3 番目のオプション: 生の SQL。

repository(:default).adapter.select('SELECT created_at FROM entries WHERE text SIMILAR TO ' + pattern)

pattern はhttp://www.postgresql.org/docs/8.3/static/functions-matching.htmlのような式になります

于 2013-01-30T20:08:07.577 に答える
0

OK、いくつかのテストを行いました。結果は次のとおりです。

解決策#1は、少量のデータの場合は少し高速ですが、> 10_000レコードの場合、2番目の解決策は明らかに高速です。

必要な要素のみを選択することで、両方のソリューションのパフォーマンスを向上させることができます。Entry.all(:text => /SomeRegexp/, :fields => [:id, :date])

両方のコードスニペットが機能しました。

より良い解決策(おそらくdatamapperまたはpostgresqlに組み込まれているもの)を知っている場合は、質問に再回答してください!;)

于 2013-01-22T14:28:43.623 に答える