2012-04-10 8 views
0

私はredditに似たシンプルなupvote/downvoteシステムを作成しています。ユーザーは何かをupvote/downvoteして、必要に応じて変更することができます。Railsコントローラがクエリを無視しています

私のコントローラの「作成」アクションにAJAX呼び出しを行うページがあります。コントローラーは、レコードを作成して、適切なjs.erbを返すのに問題はありません。しかし、私は既存の投稿が存在するかどうかを確認したいと思います。もしそうなら、私はそれを破壊したいと思います。私のコントローラは、次のようになります。

def create 
    @vote = GameVote.new 
    @vote.game_id = params[:game_id] 
    @vote.vote = params[:vote] 
    @vote.user_id = session[:user_id] 

    existing_vote = GameVote.where(whatever) 

respond_to do |format| 
    if @vote.save 
    format.js 
    end 
    end 
end 

ちょうどそれが新しいエントリを保存しようとする前に存在している場合、それを破壊するから私を防止し、中央のクエリを無視しているようです。何か案は?

+0

あなたの質問は正確には何ですか?既存の投票を見つけるには?それを削除するには?表示しているコードから何が問題なのかは非常に不明です。 – Mischa

+0

Hey @Mischa - existing_vote = GameVote.where(何でも)は解雇されません。サーバーコンソール内では、実行されているクエリが表示されず、理由を特定できません。適切な議論で、それはレールコンソールでうまく動作しますが、コントローラは実際にはそれを無視しているようです。私はなぜそれが不思議です。 – opticon

+1

これは、Railsは必要なときにのみクエリを実行するためです。 'existing_vote'で何もしないので、クエリは実行されません。これは、Railsの組み込み最適化です。 – Mischa

答えて

3

ペアの削除+作成ではなく、既存のGameVote(存在する場合)を更新する方が自然なようです。行うには

はこれだけ交換してください:

@vote = GameVote.new 
@vote.game_id = params[:game_id] 
@vote.vote = params[:vote] 
@vote.user_id = session[:user_id] 

existing_vote = GameVote.where(whatever) 

で:

@vote = GameVote.where(game_id: params[:game_id], user_id: session[:user_id]).first_or_initialize 
@vote.vote = params[:vote] 
+0

ちょっと@jdoe、貼り付けたコードがundefined_methodエラーを投げました。 (NoMethodError(未定義のメソッドの[first_or_initialize] for []:ActiveRecord :: Relation):) - 私は破壊するのではなく更新したいと思います。同じ方法でこれを行うエレガントな方法はありますか? – opticon

+2

'first_or_initialize'はRails 3.2の機能です。しかし、引き続きfind_or_initialize_by_ *アプローチを使用することができます。あなたはRailsのバージョンを指定していないので、もっと正確に答えられませんでした。 – jdoe

+0

ちょっと@jdoe - 3.1から3.2のレールにアップグレードしましたが、まだ同じエラーが発生しています。これまでのお手伝いをありがとう - うまくいけばすぐにそれを得る。 – opticon

1

試してみてください。

@vote = GameVote.find_or_create_by_game_id_and_user_id(params[:game_id], session[:user_id]) 
OR 
@vote = GameVote.find_or_create(:game_id => params[:game_id], :user_id => session[:user_id]) 

@vote.vote = params[:vote] 
+0

Hey @Vik、それらもundefined_methodエラーを投げています。私はRails 3.1.0を使用しています - アップグレードする必要がありますか? – opticon

+1

このメソッドは、レール3.0.9,3.2 + – Vik

+0

で利用できます。どうもありがとう! – opticon

関連する問題