错误未定义的局部变量或方法`created_at'

时间:2014-03-20 10:24:28

标签: mysql ruby-on-rails ruby-on-rails-4

我编写查询以了解用户在一周内减少了多少卡路里,但我有这个错误。

如何避免错误?

def self.calories_burned(current_user)
  week = ((created_at - current_user.first_program_started_at.utc.beginning_of_day) / 86400 / 7).ceil.to_i || 1
  find_by_sql("
    SELECT 
      count(*) as cnt, 
      WEEK(#{week}) as week_number
    FROM 
      user_daily_updates 
    WHERE 
      user_id=#{current_user.id} 
    GROUP BY 
      week_number
  ")
end

2 个答案:

答案 0 :(得分:2)

当你写这个:

def self.calories_burned(current_user)
    etc...
end

这是一种只能这样调用的方法:

MyUserModel.calories_burned(some_user)

在这种情况下,您在实例化之前在类上运行代码,这意味着模型甚至没有将自身附加到与数据库的连接,因此您将无法访问属于该属性的属性对你的模特。

另一方面,如果你这样写:

def calories_burned
    etc...
end

您不需要将用户传递给方法,只需在实例化模型后在控制器上调用它,如下所示:

id = 123
current_user = MyUserModel.find(id)
current_user.calories_burned

其中 current_user.calories_burned 将根据当前用户返回您要查找的值。

仔细研究一下你的方法后

看起来应该更像这样:

def calories_burned
    week = ((created_at - first_program_started_at.utc.beginning_of_day) / 86400 / 7).ceil.to_i || 1
    UserDailyUpdate.where(["user_id = ?", id]).where(["week = ?",week]]).count(:all, :group => 'week_number')
end

如果我正确理解您尝试对查询执行的操作,则应该会给您相同的结果。现在,我应该提一下,我假设您在创建表 user_daily_updates 时,还创建了一个模型UserDailyUpdate。

你应该看看ActiveRecord's documentation for searching using conditions所有第2节),以便更好地理解我刚刚做了什么。

答案 1 :(得分:1)

Apneadiving是对的,但我也希望重构您的代码:

def self.calories_burned(current_user)
   week = ((##created_at## - current_user.first_program_started_at.utc.beginning_of_day) / 86400 / 7).ceil.to_i || 1
   select("#{self.table_name}.*, count(*) as cnt, WEEK(#{week}) as week_number").where(user_id: current_user.id).group(:week_number)
end

您需要从数据库中提取created_at,因为除非您已经加载了类的实例,否则它不会出现