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を持っているaを最初に見つけます。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
于 2013-01-31T01:01:34.353 に答える