更新关联表中的数据库字段

时间:2014-01-14 17:16:48

标签: ruby-on-rails ruby database

我有一个名为“users”的数据库,其中包含一个名为“rating”的列。

用户可以从另一个用户(1个,5个或10个值)收到“奖励”,该奖励保存在“奖励”数据库中:(award_name,:award_value,:user)其中:user是id收到奖励的用户。 (检查编辑)

我想知道的是,当我将奖励数据保存到奖项数据库时,如何通过奖励的价值同时更新用户数据库中的“评级”字段?

到目前为止,这是我在awards_controller中保存奖项的代码。 @points成功包含奖励的值,我只想知道在这里添加什么来更新User表。

def create
  @points = Award::TYPES[params[:award][:name]]
  @award = current_user.awards.build(award_params)
  if @award.save
    flash[:success] = "Award Given!"
    redirect_to recipe_path(params[:recipe_id])
  else
    flash[:danger] = 'You have already awarded this user!'
    redirect_to recipe_path(params[:recipe_id])
  end
end

希望这是有道理的。谢谢!

编辑:更改了问题

我试图简化我的情况,但我想我已经走错了路。

用户可以奖励 RECIPES 由其他用户创建。当给予配方奖励(选择1,5或10个点)时,奖励数据库将填充:name,:user_id,:recipe_id,:points(其中user_id是获奖者用户的ID)

授予配方工作正常,我只需将奖励所持有的点数转移到拥有配方的用户的评级。

我有2个问题。我是否需要在奖励数据库中为食谱所有者(即奖励接收者)的ID创建另一列,然后每次我加载用户以计算他们收到的奖励的积分总和 OR 保存奖励后,有没有办法更新用户评级?

2 个答案:

答案 0 :(得分:2)

由于user has_many奖励,您只需执行以下操作:

class User < ActiveRecord::Base
...
  def rating
    recipies.joins(:awards).sum(:award_value)
  end
end

无需更新模型上的任何内容,当新奖项添加到用户时,它将自动作出反应。

答案 1 :(得分:0)

您拥有current_user的用户对象。您可以在User上创建一个更新点值的实例方法。

class User
  def reward_points(points)
    self.rating += points
    self.save
  end
end

因此,在您的create操作中,如果奖励保存,则调用current_user.reward_points(@points),您甚至可能不希望@points成为实例变量,而只需执行points并将其传递给方法。