按最近的关联筛选所有对象ActiveRecord

时间:2017-07-17 22:59:57

标签: ruby-on-rails activerecord psql

说我有Assignment

的对象has_many :exercises

根据每个对象的最新exercise来确定作业范围的最佳方法是什么?或者,我如何只选择每个作业中最新的Exercise

这样的事情是我为后者想象的:

Exercise.distinct(:assignment_id)

但这不起作用。 (返回所有练习)我也试过

Exercise.group(:assignment_id)

但是抱怨exercises.id列也必须出现在group子句中。但是,通过assignment_idid(显然)添加这些组,再次返回所有练习。

我的另一个选择,我也想知道该怎么做(似乎从来没有像我想的那样工作)是能够根据最近的练习过滤assignments

Assignment.where("most_recent_exercise.created_at <= ?", DateTime.current.beginning_of_day)

非常感谢任何帮助!

作为一个例子,给出下面的对象(假设按给定id的顺序创建)

Assignment 1
  Exercise 1
  Exercise 2
  Exercise 3

Assignment 2
  Exercise 4

Assignment 3
  Exercise 5
  Exercise 6

我希望能够致电

Exercise.most_recent并获取练习3, 4, 6,因为它们是最近为各自作业创建的练习。

1 个答案:

答案 0 :(得分:1)

  

如何只选择每项作业最新的练习?

@assignment.exercises.order(:created_at).last

这不太好,但可能会有效:

Exercise.where(
  id: Exercise.all.order(:assignment_id, :created_at).
      map{|e| e.attributes.with_indifferent_access}.
      group_by{|e| e[:assignment_id]}.
      map{|k,v| v.first}.
      map{|e| e[:id]}
)