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

标签 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

最佳答案

当你这样写的时候:

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

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

MyUserModel.calories_burned(some_user)

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

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

def calories_burned
    etc...
end

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

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 部分的所有部分)以便更好地理解我刚刚所做的事情。

关于mysql - 错误未定义局部变量或方法 `created_at',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22529950/

相关文章:

ruby-on-rails - bool 值为假且属性存在的文章 - Rails 4

javascript - 使用 angularJS 获取数据

mysql - 如何为mysql中的子查询赋予默认值?

mysql - 如何将此准备语句转换为在 Wordpress $wpdb 中使用占位符?

ruby-on-rails - 如何为 API 生成 csrf token ?

ruby-on-rails - 命名空间子域 Controller 和自定义布局

mysql - 查找在 CakePHP 中出现 N 次的模型的所有不同字段值

ruby-on-rails - rails secret_key_base 在生产中未被识别

ruby-on-rails - 无法使用 cocoon 追加表中的字段

ruby-on-rails - Form_for 嵌套对象