Поиск записей текущего месяца с запросом DataMapper - PullRequest
2 голосов
/ 13 февраля 2010

Я пытаюсь воспроизвести этот SQL-запрос, который я использовал с ActiveRecord:

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

Но так как я конвертирую все в DataMapper, я искал способ сделать это ...

Может кто-нибудь помочь?

1 Ответ

12 голосов
/ 15 февраля 2010

Я предполагаю, что это помечено как "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 из запроса (так что запрос более переносим к вещам, отличным от СУБД), и, что наиболее важно, он, вероятно, будет работать намного лучше, чем другой запрос. С EXTRACT базе данных, скорее всего, придется выполнить полное сканирование таблицы, чтобы извлечь год и месяц из созданного_ в каждой строке , а затем сравнить их с ожидаемыми значениями. Если у вас большой набор данных, это может привести к значительной нагрузке на вашу БД. Тем не менее, при условии, что ваш столбец create_at проиндексирован, приведенный выше подход должен быть чрезвычайно эффективным по сравнению.

...