扩展收集方法

时间:2015-12-16 20:37:29

标签: ruby-on-rails

问题来源:我有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方法的功能。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您应该能够使用rails方法处理此问题:

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