ActiveRecord で使用したこの SQL クエリを再現しようとしています。
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
しかし、すべてを DataMapper に変換しているので、これを行う方法を探していました...
誰でも助けることができますか?
ActiveRecord で使用したこの SQL クエリを再現しようとしています。
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
しかし、すべてを DataMapper に変換しているので、これを行う方法を探していました...
誰でも助けることができますか?
これは「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 列にインデックスが付けられている場合、上記のアプローチは比較すると非常に効率的です。