Rails 7中Chartkick关联子模型图表分组问题求助
解决Rails 7中Chartkick+Groupdate合并两个子模型数据按日期分组的问题
方案一:数据库层面联合查询(推荐)
Groupdate的group_by_day方法仅支持ActiveRecord关系对象,所以先将两个子模型的数据合并为一个ActiveRecord查询对象:
控制器代码
# 获取两个子模型的日期查询 child1_query = Child1.where(parent_id: @parent.id).select(:date) child2_query = Child2.where(parent_id: @parent.id).select(:date) # 通过UNION ALL合并两个查询,生成新的ActiveRecord关系 combined_records = Child1.from("(#{child1_query.to_sql} UNION ALL #{child2_query.to_sql}) AS combined_dates") @childs = combined_records
视图代码(仅微调原代码)
<%= column_chart @childs.group_by_day(:date, time_zone: false, format: "%d/%m/%y", range: @childs.minimum(:date)..Date.current, expand_range: true).count, height: "100px", max: 3 %>
注意:将原视图中的@childs.min_by(&:date).date替换为@childs.minimum(:date),避免加载所有记录到内存
方案二:内存中处理数组分组
如果不想修改数据库查询逻辑,可直接在内存中对日期数组进行分组和补全:
控制器代码
# 获取所有子模型的日期(过滤空值) all_dates = (@parent.childs1.pluck(:date) + @parent.childs2.pluck(:date)).compact # 按日期分组统计数量 date_counts = all_dates.group_by { |d| d.to_date }.transform_values(&:count) # 生成完整日期范围,默认填充0 start_date = all_dates.min&.to_date || Date.current end_date = Date.current full_date_range = (start_date..end_date).to_h { |date| [date.strftime("%d/%m/%y"), 0] } # 合并统计数据 date_counts.each do |date, count| full_date_range[date.strftime("%d/%m/%y")] += count end # 按日期排序 @chart_data = full_date_range.sort_by { |date_str, _| Date.strptime(date_str, "%d/%m/%y") }.to_h
视图代码
<%= column_chart @chart_data, height: "100px", max: 3 %>
问题根源
你之前用pluck得到的是二维数组,而Groupdate的group_by_day是为ActiveRecord关系/模型实例集合设计的方法,无法直接作用于数组,因此无法生成正确的分组统计。
内容的提问来源于stack exchange,提问作者mguz
相关产品推荐
相关产品推荐

