Download:
Download(29.1 MB, 16:12)
Alternativer Download für iPod & Apple TV(27.4 MB, 16:12)
Resourcen:
- Episode 205: Unobtrusive Javascript
- Highcharts
- Highcharts Options Reference
- lazy_high_charts
- Flot
- gRaphaël
- Bluff
- Full episode source code
Quellcode:
[html]
<!– layouts/application.html.erb –>
<%= javascript_include_tag "jquery-1.4.2.min", "rails", "highcharts" %>
<!– orders/index.html.erb –>
<script type="text/javascript" charset="utf-8">
$(function() {
new Highcharts.Chart({
chart: {
renderTo: "orders_chart"
},
title: {
text: "Orders by Day"
},
xAxis: {
type: "datetime"
},
yAxis: {
title: {
text: "Dollars"
}
},
tooltip: {
formatter: function() {
return Highcharts.dateFormat("%B %e, %Y", this.x) + ‚: ‚ +
"$" + Highcharts.numberFormat(this.y, 2);
}
},
series: [
<% { "Download" => Order.download, "Shipping" => Order.shipping }.each do |name, orders| %>
{
name: "<%= name %>",
pointInterval: <%= 1.day * 1000 %>,
pointStart: <%= 3.weeks.ago.to_i * 1000 %>,
data: <%= orders_chart_series(orders, 3.weeks.ago) %>
},
<% end %>
]
});
});
</script>
<div id="orders_chart" style="width:560px; height:300px;"></div>
[/html]
[ruby]
# rails c
Order.group("date(purchased_at)").select("purchased_at, sum(total_price) as total_price").first.total_price.to_f
Order.group("date(purchased_at)").select("purchased_at, sum(total_price) as total_price").first.purchased_at.to_date
# models/order.rb
scope :shipping, where(:shipping => true)
scope :download, where(:shipping => false)
def self.total_on(date)
where("date(purchased_at) = ?", date).sum(:total_price)
end
# orders_helper.rb
def orders_chart_series(orders, start_time)
orders_by_day = orders.where(:purchased_at => start_time.beginning_of_day..Time.zone.now.end_of_day).
group("date(purchased_at)").
select("purchased_at, sum(total_price) as total_price")
(start_time.to_date..Date.today).map do |date|
order = orders_by_day.detect { |order| order.purchased_at.to_date == date }
order && order.total_price.to_f || 0
end.inspect
end
[/ruby]