Rails 3 лучший способ реализовать идею кармы? - PullRequest
4 голосов
/ 06 марта 2011

У меня есть приложение, которое является простым клоном Reddit. Используя Devise, вы можете зарегистрироваться, отправить ссылки и проголосовать за них. Я начал с голосования

Я пытаюсь реализовать способ подсчета голосов в ваших ссылках к общему количеству «кармы», аля reddit. Ваша карма будет ваши положительные голоса за вычетом всех ваших отрицательных голосов. Я думаю, что мне нужно написать метод в модели пользователя (возможно, модель ссылки?)

Прямо сейчас в таблице пользователей нет поля для «кармы» или «link_score» или чего-то подобного. Может быть, добавление простого целочисленного столбца к таблице ссылок и добавление или вычитание к нему при голосовании позволило бы мне сделать это?

Прямо сейчас, чтобы отобразить количество голосов, которые я использую link.votes.count, это может быть не правильно (возможно, это показывает общее количество голосов, а не общее как Up - Down).

Github Link

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Я собираюсь использовать функции 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и т. д.

Наслаждайтесь!

2 голосов
/ 06 марта 2011

Если вы хотите, чтобы это было быстро, почему бы не добавить Karma в модель User и обновлять ее, когда кто-то голосует за / против? В противном случае вам придется постоянно рассчитывать его каждый раз, когда он отображается. Это может дорого обойтись, если у вас будет много пользователей с большой кармой, которая, как я полагаю, является вашей целью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...