如何使用ActiveRecord将多个记录正确地煮成一个?

时间:2014-05-10 11:49:39

标签: ruby-on-rails ruby

我在学习Ruby和Rails的同时也试图减肥。为此,我将我的第一个项目作为节食应用程序。每当你吃东西时,你会记下它的名字,卡路里值和糖,然后你可以查看显示你持续卡路里不足的页面,你的历史图表等等。

问题:每顿饭都有自己的记录,但是我需要将每一餐从一天的总和加到周二的总卡路里中#34;要在表中使用的值。在我将一些草率的解决方案捆绑在一起之前,我想我会问正确的方式做什么样的事情。我可以使用ActiveRecord方法吗?如果我编写自己的代码来迭代一个月的查询以构建31个每日值,我应该在我的控制器中执行此操作,还是有办法在模型中执行此操作?

2 个答案:

答案 0 :(得分:2)

迭代所有的饭菜会很糟糕,表现明智。特别是对于有很多餐的人;)它会从数据库中加载所有的膳食记录,然后加载到内存中。

ActiveRecord提供了一个使用数据库提供的计算功能的界面。只需一个查询就可以让数据库总结给定日,周或月的卡路里。

你为此做点什么:

total_calories = Meal.where('DATE(created_at) = ?', Date.today).sum(:calories)

如果您想通过单个SQL查询检索过去30天的所有餐点,您可以执行类似下面的代码。请注意即使使用分组,它仍然可以利用sum方法:

Meal.where(created_at: 1.month.ago..Time.now)
  .group('DATE(created_at)').order('date_created_at').sum(:calories)

了解Rails documentation中的计算方法。

答案 1 :(得分:1)

您可以在一个查询中按日期进行计数和分组:

Meal.select('DATE(created_at) AS ordered_date, SUM(calories) AS calories').
     group('DATE(created_at)').
     order('ordered_date')

也许你想在一个时间范围内:

where(:created_at => (Time.now.beginning_of_month..Time.now))