From 3757b279ffdc119b13cce7b408ef6a4c3ed407e7 Mon Sep 17 00:00:00 2001 From: Serge Paquet Date: Wed, 1 Jan 2014 16:02:19 -0500 Subject: [PATCH] add karma column to users table --- app/controllers/users_controller.rb | 7 +----- app/models/user.rb | 4 ---- app/models/vote.rb | 6 ++--- .../20140101202252_add_karma_to_users.rb | 23 +++++++++++++++++++ db/schema.rb | 3 ++- 5 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 db/migrate/20140101202252_add_karma_to_users.rb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6cdaca8..06511f3 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,15 +8,10 @@ class UsersController < ApplicationController @title = "Users" parents = {} - karmas = {} User.all.each do |u| (parents[u.invited_by_user_id.to_i] ||= []).push u end - Keystore.where("`key` like 'user:%:karma'").each do |k| - karmas[k.key[/\d+/].to_i] = k.value - end - @tree = [] recursor = lambda{|user,level| if user @@ -24,7 +19,7 @@ class UsersController < ApplicationController :level => level, :user_id => user.id, :username => user.username, - :karma => karmas[user.id].to_i, + :karma => user.karma, :is_moderator => user.is_moderator?, :is_admin => user.is_admin?, :created => user.created_at, diff --git a/app/models/user.rb b/app/models/user.rb index d2fb92a..fd36c64 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -107,10 +107,6 @@ class User < ActiveRecord::Base PasswordReset.password_reset_link(self, ip).deliver end - def karma - Keystore.value_for("user:#{self.id}:karma").to_i - end - def linkified_about # most users are probably mentioning "@username" to mean a twitter url, not # a link to a profile on this site diff --git a/app/models/vote.rb b/app/models/vote.rb index 1053cce..23d0867 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -131,8 +131,7 @@ class Vote < ActiveRecord::Base if v.comment_id c = Comment.find(v.comment_id) if c.user_id != user_id - Keystore.increment_value_for("user:#{c.user_id}:karma", - upvote - downvote) + User.update_counters user_id, :karma => upvote - downvote end c.give_upvote_or_downvote_and_recalculate_confidence!(upvote, @@ -140,8 +139,7 @@ class Vote < ActiveRecord::Base else s = Story.find(v.story_id) if s.user_id != user_id - Keystore.increment_value_for("user:#{s.user_id}:karma", - upvote - downvote) + User.update_counters s.user_id, :karma => upvote - downvote end s.give_upvote_or_downvote_and_recalculate_hotness!(upvote, downvote) diff --git a/db/migrate/20140101202252_add_karma_to_users.rb b/db/migrate/20140101202252_add_karma_to_users.rb new file mode 100644 index 0000000..2d04fe9 --- /dev/null +++ b/db/migrate/20140101202252_add_karma_to_users.rb @@ -0,0 +1,23 @@ +class AddKarmaToUsers < ActiveRecord::Migration + def up + add_column :users, :karma, :integer, :default => 0, :null => false + + Keystore.transaction do + User.lock(true).select(:id).each do |u| + u.update_column :karma, Keystore.value_for("user:#{u.id}:karma").to_i + end + + Keystore.where(Keystore.arel_table[:key].matches("user:%:karma")).delete_all + end + end + + def down + Keystore.transaction do + User.select(:id, :karma).each do |u| + Keystore.put("user:#{u.id}:karma", u.karma) + end + end + + remove_column :users, :karma + end +end diff --git a/db/schema.rb b/db/schema.rb index 3e2e6bc..75922ab 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20131228175805) do +ActiveRecord::Schema.define(version: 20140101202252) do create_table "comments", force: true do |t| t.datetime "created_at", null: false @@ -157,6 +157,7 @@ ActiveRecord::Schema.define(version: 20131228175805) do t.string "rss_token", limit: 75 t.string "mailing_list_token", limit: 75 t.boolean "mailing_list_enabled", default: false + t.integer "karma", default: 0, null: false end add_index "users", ["mailing_list_enabled"], name: "mailing_list_enabled", using: :btree