私の簡単な出席アプリでは、:students
,:semesters
,:attendances
があります。出席者には列student:references semester:references date:date present:boolean
があります。 semesters#show
ページで条件付きネストされたリソースを事前にロード
semester.rb
class Semester < ApplicationRecord
has_and_belongs_to_many :students
accepts_nested_attributes_for :students
end
student.rb
class Student < ApplicationRecord
has_and_belongs_to_many :semesters
has_many :attendances, dependent: :destroy
accepts_nested_attributes_for :attendances
end
attendance.rb
class Attendance < ApplicationRecord
belongs_to :semester
belongs_to :student
validates_presence_of :date
end
、私は、その学期に各学生を表示したいと各学生の出席率は以下のようになります。
それは動作しますが、私は、カウントを開始する前学期に関連付けられていないいくつかの:attendances
てフィルタリングすることがあります。だから私の目標は、その学期に属しているだけで、学期、学生、および出席者を熱心に読み込むことです。
この方法で、私は
@semester.students.each do |student|
student.attendances
end
を使用.attendances
方法はその学期に関連付けられたものを返す必要があります。これは可能ですか?
は、ここで私が使用してselect {|x| x.semester_id == @semester.id }
の代わりwhere semester_id: @semester.id
とselect &:present
代わりのwhere present: true
は、クエリの数を減少させることを見つけた私は
# semesters_controller.rb
def show
@semester = Semester.includes(students: [:attendances])
.order('students.first_name')
.find params[:id]
end
# students_helper.rb
def student_attendance(student)
total = student.attendances.select { |x| x.semester_id == @semester.id }
present = total.select &:present
percent = (present.size/total.size.to_f * 100).round rescue 0
link_to student, class: 'attendance', style: "width: #{percent}%" do
<<-HTML.html_safe
<span>#{student.first_name}</span>
<span>#{percent}%</span>
HTML
end
end
を得たものです。
とにかく、最初のフィルタ(select {|x| x.semester_id == @semester.id }
)を通過する必要がないように、:attendances
をロードする方法はありますか?私がやっているようにフィルタリングしないと、#showページに表示しようとしているこの1学期ではなく、今まで受けたすべての学期の学生の出席率が表示されます。
私はちょうどその不要なデータをすべてロードしたくない、という意味ですか?ありがとう。