Rails 3实现业力思想的最佳方式?

时间:2011-03-06 17:00:00

标签: ruby-on-rails

我有一个应用程序,它是reddit的简单克隆。使用Devise,您可以注册并提交链接并对其进行投票。我开始尝试使用vote_fu_rails_3,但是遇到了数据库问题和其他一些问题,所以我选择了自己的投票解决方案,只记录了link_id,user_id和时间戳。

我正试图在你的链接上实现投票的方式,以计入一个总的'业力'得分,ala reddit。你的业力将是你的正面投票,而不是你的负面投票。我想我需要在User模型中编写一个方法(也许是链接模型?)

现在用户表中没有“karma”或“link_score”或类似内容的字段。也许在Link表中添加一个简单的整数列,并在投票时添加或减去它会允许我这样做?

现在显示我正在使用link.votes.count的投票数,这可能不正确(也许它显示总票数而不是总票数为Up - Down)。

Github Link

2 个答案:

答案 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等等。

享受!