我有一个名为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_cost
和total_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
记录。
答案 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