【问题标题】:make a hash from active records [closed]从活动记录中进行哈希[关闭]
【发布时间】:2019-11-19 01:23:10
【问题描述】:

它可能具有相似的名称和日期。但是,取相似日期的总和。

   #<ActiveRecord::Relation [Model name: "a", date: "20190703", count: 20>
   #<ActiveRecord::Relation [Model name: "b", date: "20190702", count: 10>
   #<ActiveRecord::Relation [Model name: "a", date: "20190702", count: nil>
   #<ActiveRecord::Relation [Model name: "c", date: "20190703", count: 20>
   #<ActiveRecord::Relation [Model name: "c", date: "20190702", count: 3>
   #<ActiveRecord::Relation [Model name: "c", date: "20190702", count: 5> ...etc

预期结果会是这样的

{
    :name=>"a", :data=>[{:date=>20190702, :count=>10}, {:date=>20190703, :count=>20}.....]
    :name=>"b", :data=>[{:date=>20190702, :count=>10}, ...etc]
    :name=>"c", :data=>[{:date=>20190702, :count=>8}, {:date=>20190703, :count=>20}, ..etc]
}

【问题讨论】:

  • 这不是一个有效的Hash 请提供一个有效的语法。
  • 该数组不能在散列中“浮动”,必须分配给一个键。
  • 抱歉,我刚刚更新了最终哈希值。
  • 更好的哈希格式可能是使用名称作为键:{"a" =&gt; [{:date=&gt;20190702, :count=&gt;10}, {:date=&gt;20190703, :count=&gt;20}], "b" =&gt; [{:date=&gt;20190702, :count=&gt;10}]} 如果你愿意,你甚至可以使用日期作为内部键,但这取决于如何你想使用的数据:{"a" =&gt; {20190702 =&gt; 10, 20190703 =&gt; 20}, "b" =&gt; {20190702 =&gt; 10}}
  • @DaveMongoose .. 谢谢。你的第一个案例(哈希内的数组)应该没问题。

标签: ruby-on-rails ruby activerecord hash


【解决方案1】:

所以考虑到这是 ActiveRecord 数据开始的事实,为什么不是像

data = Model.group(:name,:date).order(name: :asc, date: :asc).sum(:count)
data.each_with_object(Hash.new {|h,k| h[k] = []}) do |((name,date),count),obj|
  obj[name] << {date: date, count: count} 
end

这将产生:

{
  "a"=>[{:date=>20190702, :count=>0}, {:date=>20190703, :count=>20}],
  "b"=>[{:date=>20190702, :count=>10}],
  "c"=>[{:date=>20190702, :count=>8}, {:date=>20190703, :count=>20}]
}

所有的求和和分组都放在事物的 SQL 端(这在聚合方面非常有效)

【讨论】:

  • tq 为您解答。如果缺少任何日期(例如:预期输出有第二个和第四个和第三个没有数据)..如何使用缺少日期和计数的哈希值将为零
  • @GaneshRaju 这是一个新的和不同的问题,请随意发布
  • 确定我会作为新问题发布。
  • {"a" => {20190702 => 10, 20190703 => 20}, "b" => {20190702 => 10}} 我们可以制作这种格式吗?
  • data.each_with_object(empty_hash) {|((site,date),count),hash| hash[site].store date, count }
【解决方案2】:

你可以拥有,

hash = users.group_by { |x| x.name }

hash.map do |name, model_data|
  {  
     name: name,
     data: model_data.group_by { |x| x[:date] }.values.map { |z| {date: z[0][:date], count: (z.inject(0) { |m,a| m += a[:count].to_i })} }
  }
end

输出将是,

[
    {:name=>"a", :data=>[{:date=>20190702, :count=>10}, {:date=>20190703, :count=>20}.....]},
    {:name=>"b", :data=>[{:date=>20190702, :count=>10}, ...etc]},
    {:name=>"c", :data=>[{:date=>20190702, :count=>8}, {:date=>20190703, :count=>20}, ..etc]}
]

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多