2

我正在运行 Ruby 2 和 Rails 4。

我正在创建一个应用程序,您可以在其中跟踪在特定日期输入的每餐的卡路里和常量营养素,但我希望能够回顾前几天。

我有一张表格,显示今天通过模型中的范围在我的索引页面上输入了哪些餐点。我将如何实现在 Rails 中回顾其他日子的能力?

我应该添加一个日期模型还是给每顿饭一个日期时间?这种东西有宝石吗?

膳食模型

class Meal < ActiveRecord::Base

  scope :today, lambda { 
    where("created_at > ?", Time.now.beginning_of_day)
    .where("created_at < ?", Time.now.end_of_day) 
  }

  scope :previous, lambda {
    where("created_at < ?", Time.now.beginning_of_day) 
  }

  validates :name, presence: true
  validates :calories, presence: true, numericality: { only
  validates :protein, numericality: { only_integer: true }
  validates :carbohydrates, numericality: { only_integer: t
  validates :fats, numericality: { only_integer: true }

  belongs_to :user

end

膳食控制器

  def index
    if user_signed_in?
      @todays_meals = current_user.meals.today
      unless current_user.bmr.blank? || current_user.weight.blank? || current_user.protein_intake.blank? || current_user.fat_percentage.blank?
        @remaining_calories = (current_user.bmr) - @todays_meals.sum(:calories)
        @remaining_protein = current_user.protein_intake - @todays_meals.sum(:protein)
        @remaining_fats = (current_user.bmr * current_user.fat_percentage / 900).to_i - @todays_meals.sum(:fats)
        @remaining_carbs = carbs_calculator
        @fat_grams = current_user.fat_percentage * current_user.bmr / 900
        @carb_grams = (carbs_calculator + @todays_meals.sum(:carbohydrates))
      end
    else
      @no_header = true
    end
  end

谢谢!

4

1 回答 1

4

首先,您可以简化您的today范围,因为实际上没有办法在今天结束之前创建一些东西(使用标准 Rails 方法,除非您手动更新 created_at 日期)。

scope :today, -> { 
  where("created_at > ?", Time.now.beginning_of_day)
}

至于前几天,可以用下面的范围抓取,按天分组

scope :in_the_past_x_days, -> (x) {
  where('meals.created_at > ?', x.days.ago)
  .group("DATE(meals.created_at)")
}

如果您正在寻找特定日期,可以使用以下方法:

scope :for_date, -> (date) { 
  where("created_at > ?", date.beginning_of_day)
  .where("created_at < ?", date.end_of_day) 
}

作为被调用方法的示例:current_user.meals.for_date(6.days.ago)

于 2013-10-22T13:34:35.303 回答