간단한 출석 앱에는 :students
, :semesters
, :attendances
이 있습니다. 출석은 열 student:references semester:references date:date present:boolean
입니다.상태가 사전 중첩 된 리소스
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
가semesters#show
페이지에서
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 페이지에 표시하려고하는 한 학기 대신 지금까지 있었던 모든 학기에 대한 학생의 출석률을 보여줍니다.
불필요한 데이터를 모두로드하고 싶지는 않습니다. 그렇지 않습니다. 감사.