class User < ActiveRecord::Base
has_many :events
has_many :trainings, -> { distinct }, through: :events
end
class Event < ActiveRecord::Base
belongs_to :user
belongs_to :training
end
class Training < ActiveRecord::Base
has_many :events
has_many :user, -> { distinct }, through: :events
end
events table contains:
t.integer "user_id"
t.integer "training_id"
t.due "date"
想象一下,events表包含以下user_id,training_id和截止日期
[ 1, 1, 25/06/16]
[ 1, 1, 25/06/15]
[ 1, 1, 25/06/14]
[ 1, 2, 25/06/16]
[ 1, 2, 25/06/15]
[ 1, 2, 25/06/14]
[ 2, 1, 25/06/16]
[ 2, 1, 25/06/15]
[ 2, 1, 25/06/14]
[ 2, 2, 25/06/16]
[ 2, 2, 25/06/15]
[ 2, 2, 25/06/14]
我想根据每个“群组”(用户和培训密钥对)的截止日期选择最新值。
即
[ 1, 1, 25/06/16]
[ 1, 2, 25/06/16]
[ 2, 1, 25/06/16]
[ 2, 2, 25/06/16]
知道如何实现这个目标吗?
答案 0 :(得分:0)
使用自定义查询进行管理。只有轻微的问题是它会选择行,即使它们不是过期的,只是最新的行。如果我输入WHERE due&lt; &#39;#{Time.now}&#39;它基本上选择了一个不是我想要的东西,但我可以在视图中放置一些东西来过滤日期&lt; Time.now as compramise。
@overdue = Event.find_by_sql("SELECT DISTINCT ON (user_id, training_id)
id, user_id, training_id, date, due FROM events
ORDER BY user_id, training_id, due DESC")
答案 1 :(得分:0)
您可以执行此操作以对其进行清理
Model
.select('DISTINCT ON (col_1, col_2) *')
.reorder(:col_1, :col_2, date_col: :desc)