Извлечение первых записей множеств, соответствующих условию where в Rails - PullRequest
0 голосов
/ 21 декабря 2010

Я хочу создать метод для моей модели деятельности, в котором есть много практик, который называется month_days_not_practiced, и который подсчитывает количество дней в текущем месяце, для которых активность не имеет записанных практик (примечание: days_in_month - вспомогательный метод):

  def month_days_not_practiced(date = Date.today)
    p = practices.where(:created_at => date.at_beginning_of_month..date.at_end_of_month).count
    days_in_month - p
  end

Однако я хочу возвращать только одну запись в день в месяц.

Может кто-нибудь помочь мне с моим пользовательским SQL (я думаю), пожалуйста?Я рисую бланк в данный момент ..

TIA!

Andy

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Поместите это в конец вашего запроса:

.group("DATE(created_at)")
0 голосов
/ 21 декабря 2010

Несмотря на то, что вы можете сделать это с помощью простой операции GROUP BY и получить нужные записи, вы можете обнаружить, что это не особенно эффективно, так как для этого потребуется сортировка на стороне сервера и ее нельзя проиндексировать:

SELECT DATE(created_at) AS on_date, COUNT(id) AS count_for_date FROM practices GROUP BY DATE(created_at)

Это вернет количество записей, проиндексированных по дням. Нулевых записей не будет, так как они не будут сгруппированы, но, как вы заметили, вы всегда можете вычислить, сколько пропущенных дней существует, исходя из того, сколько их должно быть.

Вы можете перебрать эти результаты, используя объект подключения:

Practice.connection.select_rows("...").each do |date, count|
  # ...
end

Чтобы оптимизировать это, просто добавьте столбец с индексированной датой в вашу схему:

add_column :practices, :created_on, :date

execute "UPDATE practices SET created_on=created_at"

add_index :practices, :created_on

При сохранении моделей обязательно укажите это поле:

class Practice < ActiveRecord::Base
  before_create :assign_created_on

protected
  def assign_created_on
    self.created_on = Date.today
  end
end

Это должно сделать ваш запрос полностью индексируемым и намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...