在rails中选择每组唯一密钥对的日期

时间:2016-06-25 13:07:08

标签: ruby-on-rails has-many-through

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]

知道如何实现这个目标吗?

2 个答案:

答案 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)