说我有Assignment
has_many :exercises
根据每个对象的最新exercise
来确定作业范围的最佳方法是什么?或者,我如何只选择每个作业中最新的Exercise
?
这样的事情是我为后者想象的:
Exercise.distinct(:assignment_id)
但这不起作用。 (返回所有练习)我也试过
Exercise.group(:assignment_id)
但是抱怨exercises.id
列也必须出现在group子句中。但是,通过assignment_id
和id
(显然)添加这些组,再次返回所有练习。
我的另一个选择,我也想知道该怎么做(似乎从来没有像我想的那样工作)是能够根据最近的练习过滤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
,因为它们是最近为各自作业创建的练习。
答案 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]}
)