2015-12-16 80 views
0

發行來源:我有Stream型號,其中has_may :students:through => :assignmentsStudent有一個關聯的帳戶。我需要有默認順序:@stream.studentsstudents.account.surname DESC延伸收集方法

責令一段時間後,我決定,像與Rails的預定義的方法不成立,所以我決定重新Stream實例方法students

def students(options={}) 
    opt = options || {:order=>true, :attr=>"surname", :way=>"DESC"} 
    if opt[:order] 
     students = Student.joins("INNER JOIN assignments ON students.id = assignments.student_id WHERE assignments.stream_id = #{self.id}").includes(:account).order("accounts.#{opt[:attr]} #{opt[:way]}") 
    else 
     students = Student.joins("INNER JOIN assignments ON students.id = assignments.student_id WHERE assignments.stream_id = #{self.id}").includes(:account) 
    end 
    end 

和它的工作相當精細,直到我發現,有些的收集方法採空工作,像stream.students.delete(@student)

所以我不需要重寫,但擴展@stream.students方法的功能。

我該怎麼辦?

回答

0

你應該能夠與軌道的方法來處理這個問題:

has_many :students, -> { joins(:account).order('accounts.surname') }, through: :assignments 
+0

不會''包括被越優選我需要找回帳戶數據幾乎每一次裝填回收? –

+0

'includes'不會添加連接語句,並且您不能在查詢未返回的列上進行排序。您也可以在上面添加'includes',但是我的經驗是,默認預加載關聯結果很糟糕。 'includes'實際上是相當危險的,特別是當與同一個協會加入一起使用時,我最近就這個問題進行了一次談話:https://skillsmatter.com/skillscasts/6731-activerecord-vs-n-1 – BroiSatse

+0

謝謝, 很有意思 –