2017-02-20 3 views
0

간단한 출석 앱에는 :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 

, 내가 그 학기에 학생을 표시 할, 그리고 각 학생의 출석률은 아래와 같습니다.

attendance

그것은 작동하지만, 난 카운트를 시작하기 전에 학기와 연관되지 않은 일부 :attendances를 필터링해야합니다. 그래서 제 목표는 그 학기에만 속하는 학기, 학생 및 출석을 열망하는 것입니다.

이 방법은, 내가

@semester.students.each do |student| 
    student.attendances 
end 

를 사용하는 .attendances 방법은 해당 학기에 관련된 사람들을 반환해야합니다. 이것이 가능한가?

여기 내가 사용 select {|x| x.semester_id == @semester.id } 대신 where semester_id: @semester.idselect &: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

출석을 이미 학기와 직접 연결하는 것처럼 보입니다 (출석 수업에 belongs_to :semester이 명시되어 있음).

는 시도 유무 :

class Semester < ApplicationRecord 
    has_and_belongs_to_many :students 
    has_many :attendences 
end 
attendences = @semester.attendences 

또는 단지 :

attendences = Attendence.where(semester: params[:id]) 

(당신은 SQL-쿼리를 줄이기 위해/적절한 조인을 사용하여 포함 할 수 있습니다)