2

ActiveRecord で使用したこの SQL クエリを再現しようとしています。

Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])

しかし、すべてを DataMapper に変換しているので、これを行う方法を探していました...

誰でも助けることができますか?

4

1 に答える 1

12

これは「ruby-on-rails」でタグ付けされているので、ActiveSupport が読み込まれていると思います。これにより、Time#end_of_month ヘルパー メソッドが提供されます。それを使用すると、クエリを次のように書き換えることができます。

time = Date.new(year, month).to_time

Post.all(:created_at => time..time.end_of_month)

これは単純であるだけでなく、クエリから未加工の SQL を排除し (したがって、クエリは RDBMS 以外のものへの移植性が高くなります)、最も重要なことは、おそらく他のクエリよりもはるかに優れたパフォーマンスを発揮することです。データベースでは、全テーブル スキャンを実行してすべての行EXTRACTのcreated_at から年と月を抽出し、それらを期待値と比較する必要があります。大規模なデータセットがある場合、これは DB に大きな負荷をかける可能性があります。ただし、created_at 列にインデックスが付けられている場合、上記のアプローチは比較すると非常に効率的です。

于 2010-02-15T05:20:27.823 に答える