我有一个报告表,其中包含以下列: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
包裹在一个循环中吗?或者这是一种更好的方式吗?
再次感谢你。
答案 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