Ruby on Rails - 求和计算不与模型中的关联一起使用

时间:2017-06-11 14:31:48

标签: mysql ruby-on-rails activerecord associations

我有一个用户表,其中total_user_xp列与has_many :goals关联。

目标表有一列total_goal_xp,它使用以下方法在模型中计算:

# goal.rb

  belongs_to :user
  has_many :goal_activities
  has_many :activities, through: :goal_activities

def total_goal_xp
    self.total_goal_xp = self.goal_activities.sum(:total_xp)
end 

出于某种原因,在我的用户控制器和模型文件中,我无法计算user_id与current_user匹配的total_goal_xp的总和。它总是返回值0,就好像total_goal_xp没有存储在表中一样。

我对rails很新,但我感觉我的total_goal_xp方法没有将值保存到db。它似乎每次调用该方法时重新计算总和。也就是说,在rails控制台中,运行Goal.all会给我一个表,它有正确的值,所以我不明白为什么以下方法返回值0。

user_controller.rb

def show
    @user_goals = current_user.goals.all
    @user_xp = @user_goals.sum(:total_goal_xp)
end

user.rb

has_many :goals

def set_total_user_xp
  goal = self.goals.all
  self.total_user_xp = goal.sum(:total_goal_xp)
end

在服务器日志中,我得到以下两种方法的SQL - SELECT SUM("goals"."total_goal_xp") FROM "goals" WHERE "goals"."user_id" = ? [["user_id", 1]]

我知道我不应该在控制器中进行计算,但此刻,我只是想让计算工作,所以我知道这些关联正在发挥作用。

对于保存total_goal_xp以及为total_user_xp执行相同操作的最佳做​​法提出任何建议。

如果您想查看其他任何文件,请与我们联系。

1 个答案:

答案 0 :(得分:0)

首先,您定义了与属性/列名称相同的方法名称,这是一个冲突。 其次,如果您想在旅途中计算总数,则不需要这些列。

我会在列存在时解决此问题的一种方法,使用此answer

中提到的回调设置值的更改时的总值
def set_total_xp
  goal_activity = self.goal_activities.where(goal_id: goal_id).first_or_initialize
  goal_activity.update_attribute(:total_xp, (quantity*goal.xp))
  goal = Goal.find_by_id(goal_id)
  user = goal.user
  goal.update_attribute(:total_goal_xp, goal.goal_activities.sum(:total_xp))
  user.update_attribute(:total_user_xp, user.goals.sum(:total_goal_xp))
end

或者你甚至不需要每次重新计算金额

def set_total_xp
  goal_activity = self.goal_activities.where(goal_id: goal_id).first_or_initialize
  goal_activity.update_attribute(:total_xp, (quantity*goal.xp))
  goal = Goal.find_by_id(goal_id)
  xp = goal_activity.total_xp
  goal.update_attribute(:total_goal_xp, (goal.total_goal_xp + xp))
  goal.user.update_attribute(:total_user_xp, (user.total_user_xp + xp))
end

现在你不需要这些方法,而且在显示数据时,没有查询到数据库..