0

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

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

谢谢阅读。

4

1 回答 1

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对象,允许您在执行查询之前在其上链接更多查询方法。然后我们调用#sum该关系(http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-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进行基本介绍。)

于 2013-07-08T15:01:46.350 回答