Skip to content

Commit

Permalink
[FIX]
Browse files Browse the repository at this point in the history
  • Loading branch information
Elad Meidar committed Nov 5, 2012
1 parent 595013c commit dbb7c95
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 57 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -51,6 +51,7 @@ Or install it yourself as:
include RedisTags

uses_redis_tags :engine => Redis.new
end

@user = User.new
Expand Down
4 changes: 2 additions & 2 deletions lib/redis_tags.rb
Expand Up @@ -10,7 +10,7 @@ def self.included(base)
extend ClassMethods
include InstanceMethods

#after_save :update_tags_to_redis
after_save :update_tags_to_redis

@@redis_tags_engine = nil
@@acts_as_taggable_on_steroids_legacy = false
Expand Down Expand Up @@ -42,7 +42,7 @@ def tagged_with(options = {})
end

def tagged_with_prefix(partial_tag_name)
Tag.starts_with?(self.redis_tags_engine, partial_tag_name)
RedisTags::Tag.starts_with?(self.redis_tags_engine, partial_tag_name)
end
end

Expand Down
107 changes: 54 additions & 53 deletions lib/redis_tags/tag.rb
@@ -1,68 +1,69 @@
class Tag
attr_accessor :name
attr_reader :owner_class
module RedisTags
class Tag
attr_accessor :name
attr_reader :owner_class

attr_reader :owner
attr_reader :owner

def initialize(owner, name)
@owner_class = owner.class.to_s.downcase
@name = name.downcase.strip
@owner = owner
end
def initialize(owner, name)
@owner_class = owner.class.to_s.downcase
@name = name.downcase.strip
@owner = owner
end

def Tag.starts_with?(use_engine, partial_tag_name)
use_engine.smembers "tags:all:#{partial_tag_name}"
end
def self.starts_with?(use_engine, partial_tag_name)
use_engine.smembers "tags:all:#{partial_tag_name}"
end

def Tag.register_tag_for_autocomplete(use_engine, tag_name)
partial_tag_name = ""
tag_name.each_char do |char|
partial_tag_name += char
use_engine.sadd "tags:all:#{partial_tag_name}", tag_name
def self.register_tag_for_autocomplete(use_engine, tag_name)
partial_tag_name = ""
tag_name.each_char do |char|
partial_tag_name += char
use_engine.sadd "tags:all:#{partial_tag_name}", tag_name
end
end
end

def count
engine.scard redis_key
end
def count
engine.scard redis_key
end

def Tag.tagged_with(klass, options = {})
#debugger
key_array = []
if options[:tags].to_a.size == 1
if options[:random].to_i > 0
klass.redis_tags_engine.srandmember Tag.tagged_with_key_for(klass, options[:tags]), options[:random].to_i
def self.tagged_with(klass, options = {})
#debugger
key_array = []
if options[:tags].to_a.size == 1
if options[:random].to_i > 0
klass.redis_tags_engine.srandmember RedisTags::Tag.tagged_with_key_for(klass, options[:tags]), options[:random].to_i
else
klass.redis_tags_engine.smembers RedisTags::Tag.tagged_with_key_for(klass, options[:tags])
end
else
klass.redis_tags_engine.smembers Tag.tagged_with_key_for(klass, options[:tags])
end
else
options[:tags].to_a.each do |tag_name|
key_array << Tag.tagged_with_key_for(klass, tag_name)
end
klass.redis_tags_engine.sinterstore Tag.intersect_key_for(klass, options[:tags]), *key_array
if options[:random].to_i > 0
klass.redis_tags_engine.srandmember Tag.intersect_key_for(klass, options[:tags]), options[:random].to_i
else
klass.redis_tags_engine.smembers Tag.intersect_key_for(klass, options[:tags])
options[:tags].to_a.each do |tag_name|
key_array << Tag.tagged_with_key_for(klass, tag_name)
end
klass.redis_tags_engine.sinterstore RedisTags::Tag.intersect_key_for(klass, options[:tags]), *key_array
if options[:random].to_i > 0
klass.redis_tags_engine.srandmember RedisTags::Tag.intersect_key_for(klass, options[:tags]), options[:random].to_i
else
klass.redis_tags_engine.smembers RedisTags::Tag.intersect_key_for(klass, options[:tags])
end
end
end
end

protected
protected

def Tag.intersect_key_for(klass, tags)
"#{klass.to_s.downcase}:inter:#{tags.sort.collect{ |tag_name| tag_name.downcase.strip.gsub(" ", '-') }.join(":")}"
end
def self.intersect_key_for(klass, tags)
"#{klass.to_s.downcase}:inter:#{tags.sort.collect{ |tag_name| tag_name.downcase.strip.gsub(" ", '-') }.join(":")}"
end

def Tag.tagged_with_key_for(klass, tag_name)
"#{klass.to_s.downcase}:tagged_with:#{tag_name.to_s.downcase.strip.gsub(" ", '-')}"
end
def self.tagged_with_key_for(klass, tag_name)
"#{klass.to_s.downcase}:tagged_with:#{tag_name.to_s.downcase.strip.gsub(" ", '-')}"
end

def engine
self.owner.class.redis_tags_engine
end
def engine
self.owner.class.redis_tags_engine
end

def redis_key
"#{self.owner_class}:tagged_with:#{self.name.downcase.gsub(" ", '-')}"
end
end
def redis_key
"#{self.owner_class}:tagged_with:#{self.name.downcase.gsub(" ", '-')}"
end
end
2 changes: 1 addition & 1 deletion lib/redis_tags/tag_list.rb
Expand Up @@ -19,7 +19,7 @@ def <<(tag_name)
engine.sadd "#{self.owner_class}:tagged_with:#{tag_name.gsub(" ", '-')}", self.owner_id
end
engine.multi do
Tag.register_tag_for_autocomplete(engine, tag_name)
RedisTags::Tag.register_tag_for_autocomplete(engine, tag_name)
end
end
super(tag_name)
Expand Down
6 changes: 5 additions & 1 deletion spec/models/book.rb
Expand Up @@ -13,6 +13,10 @@ def id

def save
@id = rand(1000)
self.tags_collection = RedisTags::TagList.new(self).append_multi(@tag_list)
after_save
end

def after_save
update_tags_to_redis
end
end

0 comments on commit dbb7c95

Please sign in to comment.