2017-07-17 69 views
0

说我有一个对象Assignmenthas_many :exercises筛选按最近联想对所有对象的ActiveRecord

什么是仅基于每个对象的最近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

我怎样才能选择每个作业最近的练习?

@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]} 
) 
+0

这只会得到非常最近练习的分配。我想为每个作业最近的练习。 – Rockster160

+0

同样,这只是返回单个练习。我想返回每个练习,这是任何给定作业的最后一次出现。 – Rockster160

+0

以示例更新后。 – Rockster160