我在学习Ruby和Rails的同时也试图减肥。为此,我将我的第一个项目作为节食应用程序。每当你吃东西时,你会记下它的名字,卡路里值和糖,然后你可以查看显示你持续卡路里不足的页面,你的历史图表等等。
问题:每顿饭都有自己的记录,但是我需要将每一餐从一天的总和加到周二的总卡路里中#34;要在表中使用的值。在我将一些草率的解决方案捆绑在一起之前,我想我会问正确的方式做什么样的事情。我可以使用ActiveRecord方法吗?如果我编写自己的代码来迭代一个月的查询以构建31个每日值,我应该在我的控制器中执行此操作,还是有办法在模型中执行此操作?
答案 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))