在db列中汇总哈希值并将结果放在另一个中

时间:2014-04-06 22:56:57

标签: ruby-on-rails activerecord

我有一个名为google_records的表格,其中每一行都是当天google adwords帐户的快照。

这是架构 -

create_table "google_records", :force => true do |t|
  t.string   "user_id"
  t.string   "date"
  t.text     "stats"
  t.text     "account_name"
  t.datetime "created_at",                                                        :null => false
  t.datetime "updated_at",                                                        :null => false
  t.decimal  "total_cost",        :precision => 12, :scale => 2, :default => 0.0, :null => false
  t.integer  "total_conversions",                                :default => 0,   :null => false
end

add_index "google_records", ["date"], :name => "index_google_records_on_date"

stats包含按广告系列划分的当天统计信息的哈希值,条目看起来像这样:

:Carpet Cleaning:
 :conversions: 3
 :cost: 391.47
:Upholstery Cleaning:
 :conversions: 0
 :cost: 69.96
:Air Duct Cleaning:
 :conversions: 0
 :cost: 8.68

我刚刚添加了total_costtotal_conversion列,我想每天更新每个值的总计。

我可以得到我想要在我的控制台中工作的总数(成本总额与我给出的样本不匹配,但仅仅是因为我缩短了样本以更好地适应 - 总数是正确的) - < / p>

user = User.find(6)
GoogleRecord.where(user_id: user).where(date: "20140328").map {|m| m.stats}.map{ |s| s.map{ |key,        value| value[:cost] || 0 } }.map {|m| m.inject(:+)}.compact.reduce(&:+)
=> 660.26

我想以这种方式更新表格中的所有记录以获得转化和费用并保存,但是当我尝试以下内容时:

GoogleRecord.all.each do |g|
  g.map {|m| m.stats}.map{ |s| s.map{ |key, value| value[:cost] || 0 } }.map {|m| m.inject(:+)}.compact.reduce(&:+)
end

我不断获得NoMethodError: undefined method map for GoogleRecord:0x5f09868

似乎因为我只是在示例中抓取一条记录,我应该能够将代码应用到each记录。

1 个答案:

答案 0 :(得分:0)

在您的示例代码中,where方法返回的内容类似于数组,因此map可以正常工作。但是在GoogleRecord.all.each块中,g是对db记录的引用。删除第一个地图调用,看看它是否有效。

GoogleRecord.all.each do |g|
  g.stats.map{ |s| s.map{ |key, value| value[:cost] || 0 } }.map {|m| m.inject(:+)}.compact.reduce(&:+)
end