我想做的是:
为CompetencyLog (completed_at)
Competency
查找每个Course
的最新Member
class Member < ActiveRecord::Base
has_many :competency_logs
has_many :awards
end
class CompetencyLog < ActiveRecord::Base
belongs_to :member
belongs_to :competency
has_one :course, through: :competency
end
def Course < ActiveRecord::Base
has_many :competencies
has_many :awards
end
class Competency < ActiveRecord::Base
belongs_to :course
end
我已设法获得有序列表
course = Course.find(params[:course_id])
current_member.competency_logs.where('competency_id IN (?)', course.competency_ids).ordered
从这里开始,我尝试了几件不同的事情,但没有成功。任何建议将不胜感激。希望尽可能快地在数据库中执行此操作,因为这经常被调用并依赖于CompetencyLog
上不断变化的时间戳
我想要的结果基本上是
member.competency_logs.where('competency_id IN (?)', course.competency_ids).uniq.pluck(:competency_id)
但不是competency_id,而是我想要competency_log模型
所以我添加了一些额外的关系并提出以下内容,目前正在调查postgresql DISTINCT ON
作为替代
competency_logs = competencies.collect { |c| c.competency_logs.ordered.first }
competency_logs.collect { |c| c.current? }.all?
答案 0 :(得分:0)
以下内容可行:
max_completed = current_member.competency_logs.where('competency_id IN (?)', course.competency_ids).maximum(:completed_at)
current_member.competency_logs.first(:conditions => {:completed_at => max_completed})
答案 1 :(得分:0)
这可能会解决您的问题。但它确实在假设您没有每个成员重复completed_at
个时间戳的情况下运行。
some_member.competency_logs.
where(
competency_id: some_course.competency_ids,
completed_at: some_member.competency_logs.
select("MAX(completed_at) as completed_at").
where(competency_id: some_course.competency_ids).
group(:completed_at)
)