0

我的控制器动作:

def updating_rating
    input = params[:recommendation_ratings].values

    input.each do |mini_params|
      rating_id = mini_params[:rating_id].to_i
      recommendation_id = mini_params[:recommendation_id].to_i
      puts rating_id
      puts recommendation_id
      rr = RecommendationRating.find_or_create_by_rating_id_and_recommendation_id(rating_id, recommendation_id)
      rr.update_attributes(:rating_id => rating_id, :recommendation_id => recommendation_id )
    end
   redirect_to :back, :flash => { :notice => "Rating Submitted." }
  end

在我看来,我正在从 form_tag 传递参数。代码在创建新关系时按预期工作,但是如果您尝试更新值并重新提交表单,它会添加新评级,而不是更新现有评级。

因此,例如,如果您有一个评级为 1 的产品,并将评级更改为 2 并重新提交表单,该产品的评级将为 1 和 2。我应该如何更新现有评级,而不是添加额外的评级对产品进行评级。

4

1 回答 1

0

我假设 rating_id 是您要保存的实际评级。考虑到这个假设,

rr = RecommendationRating.find_or_create_by_rating_id_and_recommendation_id(rating_id, recommendation_id)

将首先找到RecommendationRating具有rating_id新评级值的 a。如果找不到,它将创建一个。您可以通过找到RecommendationRating第一个并构建一个新的来解决这个问题,如果它不存在

rr   = RecommendationRating.find_by_recommendation_id(recommendation_id)
rr ||= RecommendationRating.new(recommendation_id: recommendation_id)

rr.rating_id = rating_id
rr.save

如果你有关联,它会看起来更干净(我在has_one这里假设一个关系,因为我们只谈论 2 列)

reco = Recommendation.find recommendation_id
rr   = reco.recommendation_rating || reco.build_recommendation_rating

rr.rating_id = rating_id
rr.save
于 2013-01-31T01:01:34.353 回答