作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] RoR 关於 资料库 query 的问题
时间Sun Oct 5 01:42:45 2008
※ 引述《WuHome (Wu)》之铭言:
: 原始资料库内容
: 唱片名称 购买地点 类别 价钱 购买日期
: AAA 台北 DVD 20 20081001
: BBB 台中 DVD 25 20081001
: CCC 台中 CD 10 20081002
: DDD 台北 DVD 30 20081002
: EEE 台中 DVD 20 20081002
: FFF 台北 CD 10 20081003
: GGG 台北 DVD 20 20081003
: 我希望能列出 我指定的日期 (比如1001 ~ 1002)
: 1001 台北 1 总价:20
: 台中 1 总价:25
: DVD 2 总价:45
: CD 0 总价:0
: 1001 台北 1 总价:30
^^^^ 打错?是不是 1002 ?
: 台中 2 总价:30
: DVD 2 总价:50
: CD 1 总价:10
: 不知道这样有没有比较清楚?
如果我猜的没错的话,你要的结果还满复杂的,
我会建议用 ruby 算,或是在 database 存 cache 直接捞出来
用 ruby 很容易,用 group_by 和 inject 即可,例如...
(以下 code 完全凭我的想像,没测试过,可能需要调整)
Order.between(start, end).group_by{ |order| order.datadate }.map{ |date_orders|
{:date => date_orders.first,
:items => date_orders.last.inject({}){ |result, order|
result[order.location] ||= { :quantity => 0,
:price_total => 0 }
result[order.location][:quantity] += 1
result[order.location][:price_total] += order.price
result
}.merge(date_orders.last.inject({}){ |result, order|
result[order.kind] ||= { :quantity => 0,
:price_total => 0 }
result[order.kind][:quantity] += 1
result[order.kind][:price_total] += order.price
result
})
}
}
上面有重复的部份,可以再提出来写成:
Order.between(start, end).group_by{ |order| order.datadate }.map{ |date_orders|
{:date => date_orders.first,
:items => [:location, :kind].inject({}){ |items, msg| items.merge(
date_orders.last.inject({}){ |result, order|
result[order.send(msg)] ||= { :quantity => 0,
:price_total => 0 }
result[order.send(msg)][:quantity] += 1
result[order.send(msg)][:price_total] += order.price
})
}
}
}
这样的结果就是:
[{:date => '1001',
:items => {'台北' => {:quantity => 1, :price_total => 20},
'台中' => {:quantity => 1, :price_total => 25},
'CD' => {:quantity => 0, :price_total => 0},
'DVD' => {:quantity => 2, :price_total => 45}}},
{:date => '1002',
:items => '略'}]
印出来就...
<%= result.map{ |row|
row[:date].to_s + row[:items].inject([]){ |result, info|
" #{info.first} #{info.last[:quantity]} 总价:#{info.last[:price_total]}"
}.join("<br/>#{' '*row[:date].to_s.size}")
}.join('<br/>') %>
我可能写得复杂些了,你可以拆成好几部份处理
--
In Lisp, you don't just write your program down toward the language,
you also build the language up toward your program.
《Programming Bottom-Up》- Paul Graham 1993
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
1F:推 WuHome:先推再试 10/05 01:57