2017-02-20 13 views
0

私の簡単な出席アプリでは、: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 

、私は、その学期に各学生を表示したいと各学生の出席率は以下のようになります。

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学期ではなく、今まで受けたすべての学期の学生の出席率が表示されます。

私はちょうどその不要なデータをすべてロードしたくない、という意味ですか?ありがとう。

答えて

1

あなたは既に出席を学期と直接結びつけているようです(出席者クラスにはbelongs_to :semesterが記載されています)。

あなたが試してみました:

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

ORだけを:

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

(あなたが適切な使用することができ合流/ SQL-クエリを減らすために含まれる)

関連する問題