Ах; Я неправильно понял «[...] и в те дни должно быть по крайней мере 1 запись каждая» - мой плохой. Я, вероятно, сделал бы это с простым вложенным выбором SQL.

аюсь выполнить запрос ActiveRecord в Rails 3.1, где я сортирую результаты по подгруппам сгруппированных элементов, в данном случае сгруппированных по дате.

Я думаю, что мой код может объяснить это лучше всего. Это мой метод, который работает, но выдает 4 запроса, чтобы выполнить работу. Кажется, не очень эффективно делать это таким образом.

def entry_days
  days = @user.entry_groups.find(
    :all,
    :select => 'date',
    :limit => 3,
    :group => 'date').map(&:date)

  entry_days = days.map do |date|
    { :date =>  date,
      :entry_groups => @user.entry_groups.find_all_by_date(date)
    }
  end      
end

Используя предложение Дэйва Ньютона ниже для использования group_by, я переписал метод следующим образом:

def entry_days
  dates_with_entries = @user.entry_groups.find(
    :all,
    :select => 'date',
    :limit => 3,
    :group => 'date').map(&:date)

  @user.entry_groups.where(:date => dates_with_entries).all.group_by(&:date).
    map do |date, entry_groups|
      { :date => date,
        :entry_groups => entry_groups }
    end
end

По крайней мере, у меня сейчас только 2 запроса.

Затем я снова переписал метод так:

  dates_with_entries = user.entry_groups.all(
      :select => 'date',
      :limit => num_days,
      :order => 'date DESC',
      :group => 'date').map(&:date)

  entry_groups = user.entry_groups.
      where(
        :date => dates_with_entries
      ).
      all(:order => 'date DESC')

  entry_days = entry_days.group_by(&:date).
      map { |date, entry_groups|
        {
          :date => date,
          :entry_groups => entry_groups
        }
      }

С другой стороны: не следует ли мне объединять столько методов в цепочку, и какой формат отступа предпочтителен для вложенных методов и хэшей?

Ответы на вопрос(1)

Ваш ответ на вопрос