Ruby on Rails唯一有序查询

时间:2015-06-25 09:30:07

标签: ruby-on-rails-4 activerecord

我想做的是:

  • 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?

2 个答案:

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