2015-06-25 66 views
1

我所試圖做的是:Ruby on Rails的獨特有序查詢

  • 找到最新CompetencyLog (completed_at)每個CompetencyCourseMember

    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

下面的工作:

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

謝謝你的迴應,但是這是行不通的。每門課程都有很多'Competencies',每個'Competency'都有很多'CompetencyLogs'我需要爲每個'Competency'獲得最新的'CompetencyLog' –

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