Ruby 板


LINE

※ 引述《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/>#{'&nbsp;'*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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP