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