Railscast#223:从数据库中获取数据

时间:2013-07-08 14:53:06

标签: javascript sql ruby-on-rails database railscasts

Railscast #223

在这个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

我不明白这是如何获取真实数据的。它是如何从数据库中获取的?他多次提到订单表,但我看不到连接的位置。

感谢阅读。

1 个答案:

答案 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进行基本介绍。)