我有一个名为“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 保存奖励后,有没有办法更新用户评级?
答案 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
并将其传递给方法。