我的控制器操作:
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.如何更新现有评级,而不是为产品添加额外评级。
答案 0 :(得分:0)
我假设rating_id是您要保存的实际评级。考虑到这一假设,
rr = RecommendationRating.find_or_create_by_rating_id_and_recommendation_id(rating_id, recommendation_id)
首先会找到RecommendationRating
,其新评级值为rating_id
。如果它找不到它会创建一个。您可以通过先找到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