2011-03-18 71 views
0

我已經實現了一個上/下投票系統,在我的Ruby on Rails應用程序中使用ajax進行更新。按鈕調用create方法,將投票插入到數據庫中,並計算投票總和。修復投票機制

但是,截至目前,用戶可以根據自己的喜好多次或多次投票。我希望投票能夠像我們在StackOverflow上看到的一樣,用戶只能投上或下投票一次,並且可以撤消投票。我如何構建這個邏輯?

回答

1

我會推薦acts_as_rateable寶石,這是我一直在使用這種多個網站的要求。完美的工作。

如果你想自己實現這個,你的Rating模型應該有一個user_id並且是多態的,以便自己附加到你想要評估的任何模型上。然後你可以簡單地編寫你的AJAX控制器來拒絕重複投票。在前端,應該使用Javascript來移除現有的upvote/downvote的鏈接功能,以實現良好的用戶體驗。

+0

現在它是一個獨立的資源,它有一個video_id和一個user_id – 2011-03-18 18:25:26

+0

如果視頻是你要評分的唯一東西,那麼這是一個好方法。在這種情況下,您可能只需執行'@previous_rating = Rating.where(:video_id => params [:video_id],:user_id => current_user.id).first'並檢查'@ previous_rating.nil?'來檢查是否該用戶之前對該視頻進行了評分。如果他有,檢查傳入的評級,如果不同,則將其更改爲upvote/downvote;如果相同,則返回。 – 2011-03-18 18:29:30

+0

這是有道理的。爲什麼你必須在'where'調用結束時執行'.first'?用戶不應該只有一個投票嗎? – 2011-03-18 18:35:28

0

我認爲你有更多的工作要做。您應該在模型中添加問題與用戶之間的多對多關係,您可以在其中記住哪個用戶投票選擇哪個問題以及以哪種方式投票(向上或向下)。之後,當您在屏幕上呈現問題時,您應該從該表中選擇與顯示的問題相關的當前用戶的投票。

當用戶投票提出問題時,您應該爲相應的表添加一條記錄。此外,顯示問題時,如果用戶已投票(downvoted),那麼您應該按順序設置upvote(downvote)鏈接的樣式。如果用戶再次投票,您可以在用戶投票之前在數據庫中註冊投票之前對其進行檢查。

也許這不是做這種事情的最快方法,但它給了你最大的控制權(你可以稍後顯示一個關於某個用戶的投票風格,投票的日期和時間的詳細統計信息鑄造,可以加以限制,以選票的用戶可以每天投等的數量...)

+0

我已經擁有video_votes作爲獨立資源的視頻和用戶之間的多對多關係。感謝您的建議。 – 2011-03-18 18:26:29

+0

然後你應該檢查你的ajax方法,如果用戶已經投票,然後堅持他的投票數據庫 – 2011-03-18 18:33:03

+0

是啊,這就是我要做的。 – 2011-03-18 18:34:33

0
class Vote < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 

    validates_uniqueness_of :user_id, :scope=>question_id  
end 

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

你的控制器,如果你嘗試多次投票將返回錯誤。如果你投下了一票,你的用戶界面就會刪除投票。

+0

如果用戶第二次投票,投票應該被撤消,所以我不認爲這是我正在尋找的。 – 2011-03-18 18:34:10

+0

爲什麼允許第二次投票? – 2011-03-18 18:36:29

+0

更具體地說,如果投票存在,你的UI應該發送一個方法=>:delete。這是SO方式。 – 2011-03-18 18:37:40