在图表中仅显示列的唯一值

时间:2013-11-08 10:25:30

标签: ruby-on-rails activerecord

我有一个报告表,其中包含以下列:id, project_id, key_id, position, created_at

下面的代码,即填充图表,我现在的代码,工作正常,但我面临的问题是key_id有多个位置,我只想要计算一次key_id有3个位置(例如)。我尝试使用distinct但它没有用。

谢谢

def self.chart_data(start = 1.weeks.ago, current_user)
   positions = where("position <=  50").position_by_day(start, current_user)
   (start.to_date..Date.today).map do |date|
   {
      created_at: date,  
      position: positions[date] || 0,
    }                    
 end                    
end                      

def self.position_by_day(start, current_user)
    user_projects = Project.where(user_id: current_user.id).first
    results = user_projects.reports.where(created_at:   start.beginning_of_day..Time.zone.now)
    results = results.group("date(created_at)")
    results = results.select("date(created_at) as created_at, count(*) as count")
    results.each_with_object({}) do |result, possitions|
      possitions[result.created_at.to_date] = result.count
    end                  
end

另外,要获得用户可以拥有的所有“密钥”,我需要为用户获取所有projects,然后通过每个项目的循环获取所有keys。我怎样才能做到这一点?我可以将results包裹在一个循环中吗?或者这是一种更好的方式吗?

再次感谢你。

2 个答案:

答案 0 :(得分:1)

您可以使用群组过滤不同的属性

def self.chart_data(start = 1.weeks.ago, current_user)
   positions = where("position <=  50").group('key_id, date(created_at)').position_by_day(start, current_user)
   (start.to_date..Date.today).map do |date|
   {
      created_at: date,  
      position: positions[date] || 0,
    }                    
 end                    
end

但有些警告。它不适用于postgres数据库。而且我不能说将返回哪些分组对象,这可能不是问题,或者您必须在sql中使用分组最大选择来控制它。

对于关联的键,您可以在查询中包含关联的对象,如下所示:

User.all(:conditions => {id: current_user.id}, :include => :keys)

答案 1 :(得分:1)

用户将所有项目发送到此方法:

def self.position_by_day(start) 
   report = where(created_at: start.beginning_of_day..Time.zone.now)
   report = report.group("date(created_at)").group(:key_id)
   report = report.select("date(created_at) as created_at, count(*) as count, key_id")
   result = report.count.inject ({}) do |hash, keydata|
     hash[keydata[0][0]] ||= 0
     hash[keydata[0][0]] += 1
     hash                 
   end                    
   return result          
 end