2011-01-07 7 views
1

私は、スルー関連とのHABTM関係の結合モデルを持っています(以下の詳細)。私はレコードを見つけようとしています....そのレコード属性の値を見つけて...値を変更してレコードを更新しますが、それを行うのは苦労しています。Rails - 結合モデルのレコード値を更新するにはどうすればよいですか?

モデルのセットアップはこれです>>

User.rb

has_many :choices 
has_many :interests, :through => :choices 

Interest.rb

has_many :choices 
has_many :users, :through => :choices 

Choice.rb

belongs_to :user 
belongs_to :interest 

と選択肢はUSER_IDを持っています、interest_id、scoreをフィールドとして使用します。

そして、私は?オブジェクトを見つけましたか? like >> >>

@choice = Choice.where(:user_id => @user.id, :interest_id => interest.id) 

したがって、モデルChoiceにはscoreという名前の属性があります。スコア列の値をどのようにして見つけるのですか?+ 1/-1それを再保存しますか?

私は何を欠場でした......私は

@choice.score = @choice.score + 1 
@choice.update_attributes(params[:choice]) 
flash[:notice] = "Successfully updated choices value." 

を試してみましたが、私は、 "未定義のメソッドのスコア" を取得?

+0

チェックを!あなたは@choiceの配列を得ているかもしれません。 –

答えて

3

あなたはおそらく、実際のクエリを実行し、結果を返すために.firstを使用する必要があります。

@choice = Choice.where(:user_id => @user.id, :interest_id => interest.id).first 

...そう@choiceのみアクティブリレーションオブジェクトを保持している...それはまだクエリを実行していません。

2

クエリでは選択肢のコレクションが返されるため、更新する実際のモデルを取得するには.firstを指定する必要があります。更新する前に、実際にオブジェクトを保持しているかどうかを常にチェックして、nilを更新しようとしないようにしてください。

さらに、フィールドを増減したい場合は、 。インクリメント!または.decrement!すぐにデータベースに更新されます。

@choice.increment!(:score) 

のparams場合ので、あなたの場合には、[:選択]は、スコア値が含まれている、それはあなたが以前に割り当てられた値を上書きします。

+0

+1は '.increment! 'を示唆しています。いいヒント。 – markquezada

1

あなたは既に@userオブジェクトを持っているので、それを使用します。

@choice = @ user.choices.find_by_interest_id(interest.id)

関連する問題