Rails急切加载条件

时间:2012-04-01 03:50:58

标签: eager-loading ruby-on-rails-3.2

我在学生和出勤率之间有关联,我想查询特定日期范围内的所有学生和相关出勤记录,包括那个日期范围内没有任何出勤记录的学生(例如建立出勤率)特定周的表格。)

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或查询数千个不需要的出勤记录的解决方案。

0 个答案:

没有答案