我有一个应用程序,它是reddit的简单克隆。使用Devise,您可以注册并提交链接并对其进行投票。我开始尝试使用vote_fu_rails_3,但是遇到了数据库问题和其他一些问题,所以我选择了自己的投票解决方案,只记录了link_id,user_id和时间戳。
我正试图在你的链接上实现投票的方式,以计入一个总的'业力'得分,ala reddit。你的业力将是你的正面投票,而不是你的负面投票。我想我需要在User模型中编写一个方法(也许是链接模型?)
现在用户表中没有“karma”或“link_score”或类似内容的字段。也许在Link表中添加一个简单的整数列,并在投票时添加或减去它会允许我这样做?
现在显示我正在使用link.votes.count的投票数,这可能不正确(也许它显示总票数而不是总票数为Up - Down)。
答案 0 :(得分:2)
如果您希望它快速,为什么不将Karma添加到用户模型并在有人投票/投票时更新它?否则,每次显示时都必须不断计算。如果你让很多用户有很多业力,我认为这是你的目标,这可能会变得昂贵。
答案 1 :(得分:2)
我将使用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等等。
享受!