在这个RailsCast的6:30,它提到将使用真实数据而不是任意数据。
/app/views/orders/index.html.erb 文件中的行
data: [1, 2, 5, 7, 3]
替换为
data: <%= (3.weeks.ago.to_date..Date.today).map { |date| Order.total_on(date).to_f}.inspect %> }]
7:30,他在订单模型中创建了一个类方法。
/app/models/order.rb
class Order < ActiveRecord::Base
def self.total_on(date)
where("date(purchased_at) = ?",date).sum(:total_price)
end
end
我不明白这是如何获取真实数据的。它是如何从数据库中获取的?他多次提到订单表,但我看不到连接的位置。
感谢阅读。
答案 0 :(得分:1)
在视图代码中,他将最近三周的日期映射到
的结果 Order.total_on(date)
方法Order::total_on
调用where
,这是一个ActiveRecord查询方法,可为查询添加条件(请参阅http://guides.rubyonrails.org/active_record_querying.html#conditions)。
由于在Order::total_on
方法的上下文中,self
引用了Order
类,我们在这里实际做的是查询:
Order.where("date(purchased_at) = ?", date)
现在实际上返回一个ActiveRecord::Relation
对象,允许您在执行查询之前在其上链接更多查询方法。然后,我们在该关系(http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum)上调用#sum
以进一步转换查询。生成的SQL看起来像:
SELECT SUM(orders.total_price) AS sum_id FROM orders WHERE (date(purchased_at) = #{date});
有点难以猜测这里的具体混淆点是什么,所以如果仍然不清楚请发表评论。
(如果我假设过多则编辑:数据库中Order
类和orders
表之间的实际连接是使用app/models/order.rb
的第一行进行的,该类继承自ActiveRecord::Base
.ActiveRecord有很多魔力 - 请参阅http://api.rubyonrails.org/files/activerecord/README_rdoc.html进行基本介绍。)