2012-04-10 112 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 2012-04-10 06:16:54

+0

Hey @Mischa - existing_vote = GameVote.where(不管)不會被解僱。在服務器控制檯中,我沒有看到正在運行的查詢,我無法弄清楚原因。有了適當的參數,它在軌道控制檯中運行良好,但控制器似乎在實踐中忽略了它。我想知道這是爲什麼。 – opticon 2012-04-10 06:22:44

+1

這是因爲Rails只在需要時才執行查詢。你不用'existing_vote'做任何事情,所以不執行任何查詢。它是Rails中的內置優化。 – Mischa 2012-04-10 06:41:20

回答

3

更新現有的GameVote(如果存在)而不是對delete + 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) 

有:

@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'爲[]:ActiveRecord :: Relation):) - 我想更新而不是銷燬。在同一個方法中有沒有一種優雅的方式來做到這一點? – opticon 2012-04-10 06:17:45

+2

'first_or_initialize'是Rails 3.2的特性。但是你仍然可以使用find_or_initialize_by_ *方法。你沒有指定你的Rails版本,所以我不能更精確地回答。 – jdoe 2012-04-10 06:35:00

+0

嘿@jdoe - 我剛剛從3.1升級到了rails 3.2,但我仍然遇到同樣的錯誤。感謝您迄今爲止的幫助 - 希望我能儘快得到它。 – opticon 2012-04-10 06:41:27

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

嘿@Vik,那些也拋出undefined_method錯誤。我正在使用Rails 3.1.0 - 我應該升級嗎? – opticon 2012-04-10 06:27:38

+1

這種方法在rails 3.0.9,3.2以上版本中可用 – Vik 2012-04-10 06:37:31

+0

如果我可以的話,我也會選擇你的答案作爲答案!非常感謝! – opticon 2012-04-10 06:47:39