Рельсы рвутся с условиями - PullRequest
1 голос
/ 01 апреля 2012

У меня есть связь между Учащимися и Посещаемостью, и я хотел бы запросить всех учащихся и связанные с ними записи посещаемости для определенного диапазона дат, включая студентов, у которых нет записей посещаемости в этом диапазоне дат (например, для создания посещаемоститаблица на определенную неделю).

class Student < ActiveRecord::Base
  has_many :attendances
  scope :with_attendances_for_week_of, lambda { |d|
    includes(:attendances).joins("LEFT OUTER JOIN attendances ON (student.id = attendances.student_id AND attendances.date BETWEEN #{(d-d.cwday+1)} AND #{(d-d.cwday+7)})")
  }
end

class Attendance < ActiveRecord::Base
  belongs_to :student
  scope :for_week_of, lambda {|d| where(:date => (d-d.cwday+1)..(d-d.cwday+7)}
end

Мне бы хотелось, чтобы был способ выполнить что-то вроде:

Student.with_attendances_for_week_of(params[:date) do |student|
  display_attendance_row student.name, student.attendances
end

Мне кажется, что я застрял в выборе между решениями, которые запрашивают ВСЕпрошлые записи посещаемости или N + 1 решения (где я запрашиваю student.attendances.for_week_of (params [: date]) для каждого учащегося.диапазон дат.

scope :with_attendances_for_date_range, lambda { |date_range|
  includes(:attendances).where(:attendances => {:date => date_range})
}

На этом этапе я бы выбрал любое решение, которое не приведет к N + 1 или запросам тысяч ненужных записей посещаемости.

...