我编写查询以了解用户在一周内减少了多少卡路里,但我有这个错误。
如何避免错误?
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
答案 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
,因为除非您已经加载了类的实例,否则它不会出现