我打算使用has_many :votes, :through => :links
和sum方法的功能。
有關更多信息檢查:
所以這裏的解決方案:
用戶表
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :name
t.timestamps
end
end
def self.down
drop_table :users
end
end
錶鏈接
class CreateLinks < ActiveRecord::Migration
def self.up
create_table :links do |t|
t.integer :user_id
t.string :url
t.timestamps
end
end
def self.down
drop_table :links
end
end
投票表
class CreateVotes < ActiveRecord::Migration
def self.up
create_table :votes do |t|
t.integer :user_id
t.integer :link_id
t.integer :score
t.timestamps
end
end
def self.down
drop_table :votes
end
end
用戶模型
class User < ActiveRecord::Base
has_many :links
has_many :votes, :through => :links
def karma
self.votes.sum(:score)
end
def positive_votes
self.votes.sum(:score, :conditions => 'score > 0')
end
def negative_votes
self.votes.sum(:score, :conditions => 'score < 0')
end
end
鏈接型號
class Link < ActiveRecord::Base
belongs_to :user
has_many :votes
end
投票模式
class Vote < ActiveRecord::Base
belongs_to :user
belongs_to :link
end
的技巧是,你設置的得分爲正值或負值讓我們說「+1」的積極投票和「-1」反對票。 注意:每票都是一個記錄。總和將是總分。
如何使用:
User.first.karma # gives you total karma
User.first.positive_votes # gives you total positive votes
User.first.negative_votes # gives you total negative votes
還有其他的功能,你可以使用像一個「值得信賴」的用戶的一票可以得分+5或-5等等,等等
享受!
這看起來不錯,但我必須做一些不正確的事情,只要將我的投票與鏈接和正在存儲的user_id關聯起來。讓我再玩一遍。你閒置一個IRC頻道嗎? – 2011-03-06 17:49:34
我在freenode的#rails中接下來的2個小時,暱稱sled_ – sled 2011-03-06 18:06:26