mysql - 根据 Rails 中的最后 has_many 记录排序

标签 mysql ruby-on-rails ruby

我有一个Student 模型和一个Gpa 模型。 学生 has_many Gpa。我如何根据学生最近创建的 gpa 记录的 value 属性对学生进行排序?

注意:我不想根据创建日期对单个学生的 GPA 进行排序。我想拉所有学生并根据他们最近的 GPA 记录对他们进行排序

class Student < ActiveRecord::Base
  has_many :gpas
end

@students = Student.order(...)

最佳答案

假设 gpas 时间戳是 updated_at

Student.joins(:gpas).order('gpas.updated_at DESC').uniq

包括没有 gpas 的学生

#references is rails 4; works in rails 3 without it
Student.includes(:gpas).order('gpas.updated_at DESC').references(:gpas).uniq

如果你不喜欢 uniq 创建的 distinct,你可以使用一些原始的 sql

Student.find_by_sql("SELECT students.* FROM students
INNER JOIN gpas ON gpas.student_id = students.id
LEFT OUTER JOIN gpas AS future ON future.student_id = gpas.student_id
  AND future.updated_at > gpas.updated_at
WHERE future.id IS NULL ORDER BY gpas.updated_at DESC")
# or some pretty raw arel
gpa_table = Gpa.arel_table
on = Arel::Nodes::On.new(
  Arel::Nodes::Equality.new(gpa_table[:student_id], Student.arel_table[:id])
)
inner_join = Arel::Nodes::InnerJoin.new(gpa_table, on)
future_gpa_table = Gpa.arel_table.alias("future")
on = Arel::Nodes::On.new(
  Arel::Nodes::Equality.new(future_gpa_table[:student_id], gpa_table[:student_id]).\
  and(future_gpa_table[:updated_at].gt(gpa_table[:updated_at])
  )
)
outer_join = Arel::Nodes::OuterJoin.new(future_gpa_table, on)
# get results
Student.joins(inner_join).joins(outer_join).where("future.id IS NULL").\
order('gpas.updated_at DESC')

关于mysql - 根据 Rails 中的最后 has_many 记录排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172817/

相关文章:

php - 使用JQuery、PHP和MySQL登录数据验证问题

mysql - 在 MySQL 中计算百分位排名

mysql - SQL:如何查找出现两次以上且具有特定值的条目

ruby-on-rails - 如何使 ActiveRecord 查询按列唯一

ruby-on-rails - Rails 在我的纯文本电子邮件中转义 HTML

ruby-on-rails - 富文本区域被隐藏并且不显示任何内容

mysql - 使用外列的唯一多列键

ruby-on-rails - Rails 应用程序中的慢动作:ActionDispatch::Routing::RouteSet#call

Ruby正则表达式匹配方法

python - 在 Python 中复制数组/列表的有效方法