【问题标题】:Updating a database field in an associated table更新关联表中的数据库字段
【发布时间】:2014-01-14 17:16:47
【问题描述】:

我有一个名为“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

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

编辑:更改的问题

我试图简化我的情况,但我认为我走错了路。

用户可以奖励其他用户创建的食谱。当给食谱奖励时(选择 1、5 或 10 分),奖励数据库中会填充 :name、:user_id、:recipe_id、:points(其中 user_id 是授予奖励的用户的 id) .

奖励配方非常有效,我只需将奖励所含的点数转移到拥有该配方的用户的评分中即可。

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

【问题讨论】:

  • 我有 1 个问题。 rating 和 Award_value 一样吗??

标签: ruby-on-rails ruby database


【解决方案1】:

由于user has_many 奖项,您可以简单地这样做:

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

模型上不需要更新任何东西,当新的奖励添加到用户时它会自动做出反应。

【讨论】:

  • 谢谢。我只是有点困惑如何在if @award.save 之后调用它。我要向奖励控制器添加任何内容吗?
  • 你不需要。每次对用户的任何实例调用 rating 时,它都会得到所有用户的奖励并总结其值。
  • 我试图简化我的问题,但我认为它适得其反。我已经对其进行了编辑以更详细地显示它。我希望这是有道理的!?
【解决方案2】:

您的用户对象为current_user。您可以在User 上创建一个实例方法来更新积分值。

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

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

【讨论】:

  • 另外,如果@award.save 失败,您可能不想重定向。相反,您应该render :new
  • 这可能非常危险 - 它会保存在给定实例上已更改的所有属性,如果任何验证未通过,它可能会失败。
  • 您可以使用 update_column 使您的方法更安全 - 它只保存指定的属性并跳过验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多