Re: [問題] RoR 關於 資料庫 query 的問題
(edited: 調整一點命名和排版)
寫了那麼一串忍不住想測試... @@
發現之前那篇只寫錯幾個地方
1. inject 記得要在最後一行用 result 寫回...
ruby 1.9 可能會新增 with_memo 之類的 method 做到一樣的事
至於 rails, 有 returning 可以用,不過我習慣用 ruby 內建的
http://www.ruby-forum.com/topic/155153
2. 印出的地方,應該用 result << "字串"; result; 而不是單純寫 "字串"
上面那兩點修掉後,看起來是運作正常,用 1.9.0-3 和 1.8.7-p72 試過。
需要注意的是,group_by 在 rails 和 1.8.7 以上的 ruby 版本,行為不相同!
rails 會回傳 array, ruby 會回傳 hash! 這部份可能要再確認一下,
我只在 ruby 1.8.7 和 1.9.0-3 上的 group_by 試過。
所有結果如下:
> ruby1.9 order.rb
[{:date=>"1001",
:items=>
{"台北"=>{:quantity=>1, :price_total=>20},
"台中"=>{:quantity=>1, :price_total=>25},
"DVD"=>{:quantity=>2, :price_total=>45}}},
{:date=>"1002",
:items=>
{"台中"=>{:quantity=>2, :price_total=>30},
"台北"=>{:quantity=>1, :price_total=>30},
"CD"=>{:quantity=>1, :price_total=>10},
"DVD"=>{:quantity=>2, :price_total=>50}}}]
> cat order.html
1001 台北 1 總價:20<br/>
台中 1 總價:25<br/>
DVD 2 總價:45<br/>
1002 台中 2 總價:30<br/>
台北 1 總價:30<br/>
CD 1 總價:10<br/>
DVD 2 總價:50
> cat order.rb
# encoding: utf-8
require 'pp'
Order = Struct.new(:date, :location, :kind, :price)
def Order.between first, last
[new('1001', '台北', 'DVD', 20),
new('1001', '台中', 'DVD', 25),
new('1002', '台中', 'CD', 10),
new('1002', '台北', 'DVD', 30),
new('1002', '台中', 'DVD', 20),
new('1003', '台北', 'CD', 10),
new('1003', '台北', 'DVD', 20)].select{ |order|
(first..last).include? order.date
}
end
pp data = Order.between('1001', '1002').group_by{ |order| order.date }.
map{ |date_orders|
{:date => date_orders.first,
:items => [:location, :kind].inject({}){ |items, msg| items.merge(
date_orders.last.inject({}){ |result, order|
category = order.send(msg)
result[category] ||= { :quantity => 0,
:price_total => 0 }
result[category][:quantity] += 1
result[category][:price_total] += order.price
result
})
}
}
}
File.open('order.html', 'w') <<
data.map{ |row|
row[:date].to_s +
row[:items].inject([]){ |result, info|
result << " #{info.first} #{info.last[:quantity]} 總價:#{info.last[:price_total]}"
result
}.join("<br/>\n#{' '*row[:date].to_s.size}")
}.join("<br/>\n")
--
By Gamers, For Gamers - from the past Interplay
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
※ 編輯: godfat 來自: 220.135.28.18 (10/05 02:47)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 3 之 4 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章