recommendable 1.1.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/lib/recommendable.rb +38 -26
  2. data/lib/recommendable/configuration.rb +47 -0
  3. data/lib/recommendable/helpers.rb +3 -9
  4. data/lib/recommendable/helpers/calculations.rb +150 -0
  5. data/lib/recommendable/helpers/queriers.rb +23 -0
  6. data/lib/recommendable/helpers/redis_key_mapper.rb +29 -0
  7. data/lib/recommendable/orm/active_record.rb +6 -0
  8. data/lib/recommendable/orm/data_mapper.rb +7 -0
  9. data/lib/recommendable/orm/mongo_mapper.rb +8 -0
  10. data/lib/recommendable/orm/mongoid.rb +7 -0
  11. data/lib/recommendable/ratable.rb +83 -0
  12. data/lib/recommendable/ratable/dislikable.rb +26 -0
  13. data/lib/recommendable/ratable/likable.rb +26 -0
  14. data/lib/recommendable/rater.rb +109 -0
  15. data/lib/recommendable/rater/bookmarker.rb +120 -0
  16. data/lib/recommendable/rater/disliker.rb +122 -0
  17. data/lib/recommendable/rater/hider.rb +120 -0
  18. data/lib/recommendable/rater/liker.rb +122 -0
  19. data/lib/recommendable/rater/recommender.rb +68 -0
  20. data/lib/recommendable/version.rb +5 -4
  21. data/lib/recommendable/workers/delayed_job.rb +16 -0
  22. data/lib/recommendable/workers/rails.rb +16 -0
  23. data/lib/recommendable/workers/resque.rb +13 -0
  24. data/lib/recommendable/workers/sidekiq.rb +13 -0
  25. metadata +62 -131
  26. data/.gitignore +0 -57
  27. data/.travis.yml +0 -3
  28. data/CHANGELOG.markdown +0 -159
  29. data/Gemfile +0 -3
  30. data/Gemfile.lock +0 -112
  31. data/LICENSE.txt +0 -22
  32. data/README.markdown +0 -135
  33. data/Rakefile +0 -26
  34. data/TODO +0 -7
  35. data/app/models/recommendable/dislike.rb +0 -19
  36. data/app/models/recommendable/ignore.rb +0 -19
  37. data/app/models/recommendable/like.rb +0 -19
  38. data/app/models/recommendable/stash.rb +0 -19
  39. data/app/workers/recommendable/delayed_job_worker.rb +0 -17
  40. data/app/workers/recommendable/rails_worker.rb +0 -17
  41. data/app/workers/recommendable/resque_worker.rb +0 -14
  42. data/app/workers/recommendable/sidekiq_worker.rb +0 -14
  43. data/config/routes.rb +0 -3
  44. data/db/migrate/20120124193723_create_likes.rb +0 -17
  45. data/db/migrate/20120124193728_create_dislikes.rb +0 -17
  46. data/db/migrate/20120127092558_create_ignores.rb +0 -17
  47. data/db/migrate/20120131173909_create_stashes.rb +0 -17
  48. data/lib/generators/recommendable/USAGE +0 -8
  49. data/lib/generators/recommendable/install_generator.rb +0 -40
  50. data/lib/generators/recommendable/templates/initializer.rb +0 -28
  51. data/lib/recommendable/acts_as_recommendable.rb +0 -176
  52. data/lib/recommendable/acts_as_recommended_to.rb +0 -774
  53. data/lib/recommendable/engine.rb +0 -14
  54. data/lib/recommendable/exceptions.rb +0 -4
  55. data/lib/recommendable/railtie.rb +0 -6
  56. data/lib/sidekiq/middleware/client/unique_jobs.rb +0 -37
  57. data/lib/sidekiq/middleware/server/unique_jobs.rb +0 -17
  58. data/lib/tasks/recommendable_tasks.rake +0 -1
  59. data/recommendable.gemspec +0 -30
  60. data/script/rails +0 -8
  61. data/spec/configuration_spec.rb +0 -9
  62. data/spec/dummy/README.rdoc +0 -261
  63. data/spec/dummy/Rakefile +0 -7
  64. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  65. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  66. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  67. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  68. data/spec/dummy/app/mailers/.gitkeep +0 -0
  69. data/spec/dummy/app/models/.gitkeep +0 -0
  70. data/spec/dummy/app/models/bully.rb +0 -2
  71. data/spec/dummy/app/models/movie.rb +0 -2
  72. data/spec/dummy/app/models/php_framework.rb +0 -2
  73. data/spec/dummy/app/models/user.rb +0 -3
  74. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  75. data/spec/dummy/config.ru +0 -4
  76. data/spec/dummy/config/application.rb +0 -56
  77. data/spec/dummy/config/boot.rb +0 -10
  78. data/spec/dummy/config/database.yml +0 -25
  79. data/spec/dummy/config/environment.rb +0 -5
  80. data/spec/dummy/config/environments/development.rb +0 -37
  81. data/spec/dummy/config/environments/production.rb +0 -67
  82. data/spec/dummy/config/environments/test.rb +0 -37
  83. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  84. data/spec/dummy/config/initializers/inflections.rb +0 -15
  85. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  86. data/spec/dummy/config/initializers/recommendable.rb +0 -14
  87. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  88. data/spec/dummy/config/initializers/session_store.rb +0 -8
  89. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  90. data/spec/dummy/config/locales/en.yml +0 -5
  91. data/spec/dummy/config/routes.rb +0 -4
  92. data/spec/dummy/db/migrate/20120128005553_create_likes.recommendable.rb +0 -18
  93. data/spec/dummy/db/migrate/20120128005554_create_dislikes.recommendable.rb +0 -18
  94. data/spec/dummy/db/migrate/20120128005555_create_ignores.recommendable.rb +0 -18
  95. data/spec/dummy/db/migrate/20120128020228_create_users.rb +0 -9
  96. data/spec/dummy/db/migrate/20120128020413_create_movies.rb +0 -10
  97. data/spec/dummy/db/migrate/20120128024632_create_php_frameworks.rb +0 -9
  98. data/spec/dummy/db/migrate/20120128024804_create_bullies.rb +0 -9
  99. data/spec/dummy/db/migrate/20120131195416_create_stashes.recommendable.rb +0 -19
  100. data/spec/dummy/db/schema.rb +0 -89
  101. data/spec/dummy/lib/assets/.gitkeep +0 -0
  102. data/spec/dummy/log/.gitkeep +0 -0
  103. data/spec/dummy/public/404.html +0 -26
  104. data/spec/dummy/public/422.html +0 -26
  105. data/spec/dummy/public/500.html +0 -25
  106. data/spec/dummy/public/favicon.ico +0 -0
  107. data/spec/dummy/recommendable_dummy_development +0 -0
  108. data/spec/dummy/recommendable_dummy_test +0 -0
  109. data/spec/dummy/script/rails +0 -6
  110. data/spec/factories.rb +0 -16
  111. data/spec/models/dislike_spec.rb +0 -41
  112. data/spec/models/ignore_spec.rb +0 -27
  113. data/spec/models/like_spec.rb +0 -42
  114. data/spec/models/movie_spec.rb +0 -82
  115. data/spec/models/stash_spec.rb +0 -27
  116. data/spec/models/user_benchmark_spec.rb +0 -49
  117. data/spec/models/user_spec.rb +0 -443
  118. data/spec/spec_helper.rb +0 -28
data/Rakefile DELETED
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
-
6
- begin
7
- Bundler.setup(:default, :development)
8
- rescue Bundler::BundlerError => e
9
- $stderr.puts e.message
10
- $stderr.puts "Run `bundle install` to install missing gems"
11
- exit e.status_code
12
- end
13
-
14
- require 'rake'
15
-
16
- require 'rake/testtask'
17
- Rake::TestTask.new(:test) do |test|
18
- test.libs << 'lib' << 'spec'
19
- test.pattern = 'spec/**/*_spec.rb'
20
- test.verbose = true
21
- end
22
-
23
- task :default => :test
24
-
25
- require 'yard'
26
- YARD::Rake::YardocTask.new
data/TODO DELETED
@@ -1,7 +0,0 @@
1
- = TODO
2
-
3
- * method_missing for User#common_likes_with, User#common_liked_with
4
- * Use Sidekiq instead?
5
- * Move dependencies to gemspec instead of Gemfile
6
- * Support Mongoid (and potentially other ORMs)
7
- * Allow the option NOT to queue up on like/dislike/ignore?
@@ -1,19 +0,0 @@
1
- module Recommendable
2
- class Dislike < ActiveRecord::Base
3
- self.table_name = 'recommendable_dislikes'
4
- attr_accessible :user_id, :dislikeable_id, :dislikeable_type
5
-
6
- belongs_to :user, :class_name => Recommendable.user_class.to_s, :foreign_key => :user_id
7
- belongs_to :dislikeable, :polymorphic => true
8
-
9
- validates :user_id, :uniqueness => { :scope => [:dislikeable_id, :dislikeable_type],
10
- :message => "has already disliked this item" },
11
- :presence => true
12
- validates_presence_of :dislikeable_id
13
- validates_presence_of :dislikeable_type
14
-
15
- def dislikeable_type=(sType)
16
- super sType.to_s.classify.constantize.base_class.to_s
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- module Recommendable
2
- class Ignore < ActiveRecord::Base
3
- self.table_name = 'recommendable_ignores'
4
- attr_accessible :user_id, :ignorable_id, :ignorable_type
5
-
6
- belongs_to :user, :class_name => Recommendable.user_class.to_s, :foreign_key => :user_id
7
- belongs_to :ignorable, :polymorphic => true
8
-
9
- validates :user_id, :uniqueness => { :scope => [:ignorable_id, :ignorable_type],
10
- :message => "has already ignored this item" },
11
- :presence => true
12
- validates_presence_of :ignorable_id
13
- validates_presence_of :ignorable_type
14
-
15
- def ignorable_type=(sType)
16
- super sType.to_s.classify.constantize.base_class.to_s
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- module Recommendable
2
- class Like < ActiveRecord::Base
3
- self.table_name = 'recommendable_likes'
4
- attr_accessible :user_id, :likeable_id, :likeable_type
5
-
6
- belongs_to :user, :class_name => Recommendable.user_class.to_s, :foreign_key => :user_id
7
- belongs_to :likeable, :polymorphic => true, :foreign_key => :likeable_id
8
-
9
- validates :user_id, :uniqueness => { :scope => [:likeable_id, :likeable_type],
10
- :message => "has already liked this item" },
11
- :presence => true
12
- validates_presence_of :likeable_id
13
- validates_presence_of :likeable_type
14
-
15
- def likeable_type=(sType)
16
- super sType.to_s.classify.constantize.base_class.to_s
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- module Recommendable
2
- class Stash < ActiveRecord::Base
3
- self.table_name = 'recommendable_stashes'
4
- attr_accessible :user_id, :stashable_id, :stashable_type
5
-
6
- belongs_to :user, :class_name => Recommendable.user_class.to_s, :foreign_key => :user_id
7
- belongs_to :stashable, :polymorphic => :true
8
-
9
- validates :user_id, :uniqueness => { :scope => [:stashable_id, :stashable_type],
10
- :message => "has already stashed this item" },
11
- :presence => true
12
- validates_presence_of :stashable_id
13
- validates_presence_of :stashable_type
14
-
15
- def stashable_type=(sType)
16
- super sType.to_s.classify.constantize.base_class.to_s
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- module Recommendable
2
- if defined?(Delayed::Job)
3
- class DelayedJobWorker
4
- attr_accessor :user_id
5
-
6
- def initialize(user_id)
7
- @user_id = user_id
8
- end
9
-
10
- def perform
11
- user = Recommendable.user_class.find(self.user_id)
12
- user.send :update_similarities
13
- user.send :update_recommendations
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- module Recommendable
2
- if defined?(Rails::Queueing)
3
- class RailsWorker
4
- attr_accessor :user_id
5
-
6
- def initialize(user_id)
7
- @user_id = user_id
8
- end
9
-
10
- def run
11
- user = Recommendable.user_class.find(self.user_id)
12
- user.send :update_similarities
13
- user.send :update_recommendations
14
- end
15
- end
16
- end
17
- end
@@ -1,14 +0,0 @@
1
- module Recommendable
2
- if defined?(Resque)
3
- class ResqueWorker
4
- include Resque::Plugins::UniqueJob if defined?(Resque::Plugins::UniqueJob)
5
- @queue = :recommendable
6
-
7
- def self.perform(user_id)
8
- user = Recommendable.user_class.find(user_id)
9
- user.send :update_similarities
10
- user.send :update_recommendations
11
- end
12
- end
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- module Recommendable
2
- if defined?(Sidekiq)
3
- class SidekiqWorker
4
- include ::Sidekiq::Worker
5
- sidekiq_options :queue => :recommendable, :unique => true
6
-
7
- def perform(user_id)
8
- user = Recommendable.user_class.find(user_id)
9
- user.send :update_similarities
10
- user.send :update_recommendations
11
- end
12
- end
13
- end
14
- end
@@ -1,3 +0,0 @@
1
- Recommendable::Engine.routes.draw do
2
-
3
- end
@@ -1,17 +0,0 @@
1
- class CreateLikes < ActiveRecord::Migration
2
- def up
3
- create_table :recommendable_likes do |t|
4
- t.references :user
5
- t.references :likeable, :polymorphic => true
6
- t.timestamps
7
- end
8
-
9
- add_index :recommendable_likes, :likeable_id
10
- add_index :recommendable_likes, :likeable_type
11
- add_index :recommendable_likes, [:user_id, :likeable_id, :likeable_type], :unique => true, :name => "user_like_constraint"
12
- end
13
-
14
- def down
15
- drop_table :recommendable_likes
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- class CreateDislikes < ActiveRecord::Migration
2
- def up
3
- create_table :recommendable_dislikes do |t|
4
- t.references :user
5
- t.references :dislikeable, :polymorphic => true
6
- t.timestamps
7
- end
8
-
9
- add_index :recommendable_dislikes, :dislikeable_id
10
- add_index :recommendable_dislikes, :dislikeable_type
11
- add_index :recommendable_dislikes, [:user_id, :dislikeable_id, :dislikeable_type], :unique => true, :name => "user_dislike_constraint"
12
- end
13
-
14
- def down
15
- drop_table :recommendable_dislikes
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- class CreateIgnores < ActiveRecord::Migration
2
- def up
3
- create_table :recommendable_ignores do |t|
4
- t.references :user
5
- t.references :ignorable, :polymorphic => true
6
- t.timestamps
7
- end
8
-
9
- add_index :recommendable_ignores, :ignorable_id
10
- add_index :recommendable_ignores, :ignorable_type
11
- add_index :recommendable_ignores, [:user_id, :ignorable_id, :ignorable_type], :unique => true, :name => "user_ignore_constraint"
12
- end
13
-
14
- def down
15
- drop_table :recommendable_ignores
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- class CreateStashes < ActiveRecord::Migration
2
- def up
3
- create_table :recommendable_stashes do |t|
4
- t.references :user
5
- t.references :stashable, :polymorphic => true
6
- t.timestamps
7
- end
8
-
9
- add_index :recommendable_stashes, :stashable_id
10
- add_index :recommendable_stashes, :stashable_type
11
- add_index :recommendable_stashes, [:user_id, :stashable_id, :stashable_type], :unique => true, :name => "user_stashed_constraint"
12
- end
13
-
14
- def down
15
- drop_table :recommendable_stashes
16
- end
17
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- This generator will install Recommendable's initializer.rb file and migrate the Like and Dislike tables into your database unless specified.
3
-
4
- Example:
5
- rails generate recommendable:install
6
-
7
- This will create:
8
- config/initializers/recommendable.rb
@@ -1,40 +0,0 @@
1
- require 'rails/generators'
2
-
3
- module Recommendable
4
- module Generators
5
- class InstallGenerator < Rails::Generators::Base
6
- argument :redis_host, :type => :string, :default => "localhost", :desc => "The hostname your redis server is running on."
7
- argument :redis_port, :type => :string, :default => "6379", :desc => "The port your redis server is running on."
8
- class_option :redis_socket, :type => :string, :desc => "Indicates the UNIX socket your redis server is running on (if it is)."
9
- class_option :no_migrate, :type => :boolean, :default => false, :desc => "Skip migrations. The Like and Dislike tables will not be created."
10
-
11
- source_root File.expand_path("../templates", __FILE__)
12
-
13
- def add_recommendable_initializer
14
- path = "#{Rails.root}/config/initializers/recommendable.rb"
15
- if File.exists?(path)
16
- puts "Skipping config/initializers/recommendable.rb creation; file already exists!"
17
- else
18
- puts "Adding Recommendable initializer (config/initializers/recommendable.rb)"
19
- template "initializer.rb", path
20
- end
21
- end
22
-
23
- def install_migrations
24
- puts "Copying migrations..."
25
- Dir.chdir(Rails.root) { puts `rake recommendable:install:migrations` }
26
- end
27
-
28
- def run_migrations
29
- unless options[:no_migrate]
30
- puts "Running rake db:migrate"
31
- puts `rake db:migrate`
32
- end
33
- end
34
-
35
- def finished
36
- puts "Done! Recommendable has been successfully installed. Please configure it in config/intializers/recommendable.rb"
37
- end
38
- end
39
- end
40
- end
@@ -1,28 +0,0 @@
1
- require "redis"
2
-
3
- # Recommendable requires a connection to a running redis-server. Either create
4
- # a new instance based on a host/port or UNIX socket, or pass in an existing
5
- # Redis client instance.
6
- <% if options.redis_socket %># <% end %>Recommendable.redis = Redis.new(:host => "<%= redis_host %>", :port => <%= redis_port %>)
7
-
8
- # Connect to Redis via a UNIX socket instead
9
- <% unless options.redis_socket %># <% end %>Recommendable.redis = Redis.new(:sock => "<%= options.redis_socket %>")
10
-
11
- # Tell Redis which database to use (usually between 0 and 15). The default of 0
12
- # is most likely okay unless you have another application using that database.
13
- # Recommendable.redis.select "0"
14
-
15
- # If using Sidekiq, uncomment the following or place it in config/initializers/sidekiq.rb:
16
- # Sidekiq.configure_server do |config|
17
- # require 'sidekiq/middleware/server/unique_jobs'
18
- # config.server_middleware do |chain|
19
- # chain.add Sidekiq::Middleware::Server::UniqueJobs
20
- # end
21
- # end
22
- #
23
- # Sidekiq.configure_client do |config|
24
- # require 'sidekiq/middleware/client/unique_jobs'
25
- # config.client_middleware do |chain|
26
- # chain.add Sidekiq::Middleware::Client::UniqueJobs
27
- # end
28
- # end
@@ -1,176 +0,0 @@
1
- module Recommendable
2
- module ActsAsRecommendable
3
- extend ActiveSupport::Concern
4
-
5
- module ClassMethods
6
- def acts_as_recommendable
7
- class_eval do
8
- Recommendable.recommendable_classes << self
9
-
10
- has_many :recommendable_likes, :as => :likeable, :dependent => :destroy,
11
- :class_name => "Recommendable::Like"
12
- has_many :recommendable_dislikes, :as => :dislikeable, :dependent => :destroy,
13
- :class_name => "Recommendable::Dislike"
14
- has_many :recommendable_ignores, :as => :ignorable, :dependent => :destroy,
15
- :class_name => "Recommendable::Ignore"
16
- has_many :recommendable_stashes, :as => :stashable, :dependent => :destroy,
17
- :class_name => "Recommendable::Stash"
18
-
19
- has_many :liked_by, :through => :recommendable_likes, :source => :user,
20
- :foreign_key => :user_id, :class_name => Recommendable.user_class.to_s
21
- has_many :disliked_by, :through => :recommendable_dislikes, :source => :user,
22
- :foreign_key => :user_id, :class_name => Recommendable.user_class.to_s
23
-
24
- include LikeableMethods
25
- include DislikeableMethods
26
-
27
- before_destroy :remove_from_scores, :remove_from_recommendations
28
-
29
- def self.acts_as_recommendable?() true end
30
-
31
- def been_rated?
32
- recommendable_likes.count + recommendable_dislikes.count > 0
33
- end
34
-
35
- # Returns an array of users that have liked or disliked this item.
36
- # @return [Array] an array of users
37
- def rated_by
38
- liked_by + disliked_by
39
- end
40
-
41
- def self.top count = 1
42
- ids = Recommendable.redis.zrevrange(self.score_set, 0, count - 1).map(&:to_i)
43
-
44
- items = self.find ids
45
- return items.first if count == 1
46
-
47
- return items.sort_by { |item| ids.index(item.id) }
48
- end
49
-
50
- private
51
-
52
- def update_score
53
- return 0 unless been_rated?
54
-
55
- z = 1.96
56
- n = recommendable_likes.count + recommendable_dislikes.count
57
-
58
- phat = recommendable_likes.count / n.to_f
59
- score = (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
60
-
61
- Recommendable.redis.zadd self.class.score_set, score, self.id
62
- true
63
- end
64
-
65
- def remove_from_scores
66
- Recommendable.redis.zrem self.class.score_set, self.id
67
- true
68
- end
69
-
70
- def remove_from_recommendations
71
- Recommendable.user_class.find_each do |user|
72
- user.send :completely_unrecommend, self
73
- end
74
- end
75
-
76
- # Used for setup purposes. Calls convenience methods to create sets
77
- # in redis of users that both like and dislike this object.
78
- # @return [Array] an array containing the liked_by set and the disliked_by set
79
- # @private
80
- def create_recommendable_sets
81
- [create_liked_by_set, create_disliked_by_set]
82
- end
83
-
84
- # Used for teardown purposes. Destroys the sets in redis created by
85
- # {#create_recommendable_sets}
86
- # @private
87
- def destroy_recommendable_sets
88
- Recommendable.redis.del "#{self.class.base_class}:#{id}:liked_by"
89
- Recommendable.redis.del "#{self.class.base_class}:#{id}:disliked_by"
90
- end
91
-
92
- # Returns an array of IDs of users that have liked or disliked this item.
93
- # @return [Array] an array of user IDs
94
- # @private
95
- def rates_by
96
- recommendable_likes.map(&:user_id) + recommendable_dislikes.map(&:user_id)
97
- end
98
-
99
- def self.score_set
100
- "#{self}:sorted"
101
- end
102
-
103
- private :recommendable_likes, :recommendable_dislikes,
104
- :recommendable_ignores, :recommendable_stashes
105
- end
106
- end
107
-
108
- def acts_as_recommendable?() false end
109
-
110
- def sti?
111
- self.base_class != self && self.base_class.table_name == self.table_name
112
- end
113
-
114
- private
115
- end
116
-
117
- # Instance methods.
118
- def recommendable?() self.class.acts_as_recommendable? end
119
-
120
- def redis_key() "#{self.class.base_class}:#{id}" end
121
-
122
- protected :redis_key
123
-
124
- module LikeableMethods
125
- # Retrieve the number of likes this object has received. Cached in Redis.
126
- # @return [Fixnum] the number of times this object has been liked
127
- def like_count
128
- Recommendable.redis.get("#{redis_key}:like_count").to_i
129
- end
130
-
131
- private
132
-
133
- # Updates the cache for how many times this object has been liked.
134
- # @private
135
- def update_like_count
136
- Recommendable.redis.set "#{redis_key}:like_count", liked_by.count
137
- end
138
-
139
- # Used for setup purposes. Creates a set in redis containing users that
140
- # have liked this object.
141
- # @private
142
- # @return [String] the key in Redis pointing to the set
143
- def create_liked_by_set
144
- set = "#{redis_key}:liked_by"
145
- liked_by.each { |rater| Recommendable.redis.sadd set, rater.id }
146
- return set
147
- end
148
- end
149
-
150
- module DislikeableMethods
151
- # Retrieve the number of dislikes this object has received. Cached in Redis.
152
- # @return [Fixnum] the number of times this object has been disliked
153
- def dislike_count
154
- Recommendable.redis.get("#{redis_key}:dislike_count").to_i
155
- end
156
-
157
- private
158
-
159
- # Updates the cache for how many times this object has been disliked.
160
- # @private
161
- def update_dislike_count
162
- Recommendable.redis.set "#{redis_key}:dislike_count", disliked_by.count
163
- end
164
-
165
- # Used for setup purposes. Creates a set in redis containing users that
166
- # have disliked this object.
167
- # @private
168
- # @return [String] the key in Redis pointing to the set
169
- def create_disliked_by_set
170
- set = "#{redis_key}:disliked_by"
171
- disliked_by.each { |rater| Recommendable.redis.sadd set, rater.id }
172
- return set
173
- end
174
- end
175
- end
176
- end