【问题标题】:How can I order a Rails collection by the attributes of associated records?如何通过关联记录的属性对 Rails 集合进行排序?
【发布时间】:2013-04-17 23:27:27
【问题描述】:

我有三个模型:教师、学生和作业

class Teacher < ActiveRecord::Base
  has_many :assignments
  has_many :students, through: assignments, uniq: true
end

对于任何给定的老师,我想检索一个独特的学生列表 - 很简单,我只需调用:

teacher.students

但是,我想根据最近提交作业的学生列表来排序。具体来说,我希望拥有最近更新作业的学生最先出现,依此类推。

我被以下代码卡住了,这是行不通的:

teacher.students.group("assignments.student_id").order("MAX(assignments.updated_at) DESC")

有什么建议吗?

【问题讨论】:

  • 该查询出现什么错误?
  • 不是错误,但排序工作不正常。抱歉不清楚。

标签: sql ruby-on-rails rails-activerecord active-record-query


【解决方案1】:

看来我原来的查询是正确的:

teacher.students.group("assignments.student_id").order("MAX(assignments.updated_at) DESC")

我曾认为它不起作用,因为我编写了一个糟糕的 RSpec 测试失败了,因为我没有很好地处理时间戳。一旦我使用Timecop 正确处理时间戳,测试就通过了。

对此感到抱歉。

【讨论】:

    【解决方案2】:

    没有真正测试过,但我相信

    teacher.students.includes(:assignments).order('assignments.updated_at')
    

    应该工作

    【讨论】:

    • 看起来不错,但我忘了说明学生应该是独一无二的。对于独特的学生,我认为 .group 方法是必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2018-04-29
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多