mbleigh-acts-as-taggable-on 1.0.3 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -50,7 +50,7 @@ try just installing it as a normal gem:
50
50
  Post Installation (Rails)
51
51
  -------------------------
52
52
  1. script/generate acts_as_taggable_on_migration
53
- 2. rake db/migrate
53
+ 2. rake db:migrate
54
54
 
55
55
  Testing
56
56
  =======
@@ -19,9 +19,11 @@ module ActiveRecord
19
19
  args.compact! if args
20
20
  for tag_type in args
21
21
  tag_type = tag_type.to_s
22
+ # use aliased_join_table_name for context condition so that sphix can join multiple
23
+ # tag references from same model without getting an ambiguous column error
22
24
  self.class_eval do
23
25
  has_many "#{tag_type.singularize}_taggings".to_sym, :as => :taggable, :dependent => :destroy,
24
- :include => :tag, :conditions => ["context = ?",tag_type], :class_name => "Tagging"
26
+ :include => :tag, :conditions => ['#{aliased_join_table_name rescue "taggings"}.context = ?',tag_type], :class_name => "Tagging"
25
27
  has_many "#{tag_type}".to_sym, :through => "#{tag_type.singularize}_taggings".to_sym, :source => :tag
26
28
  end
27
29
 
@@ -62,6 +64,10 @@ module ActiveRecord
62
64
  def find_related_#{tag_type}_for(klass, options = {})
63
65
  related_tags_for('#{tag_type}', klass, options)
64
66
  end
67
+
68
+ def top_#{tag_type}(limit = 10)
69
+ tag_counts_on('#{tag_type}', :order => 'count desc', :limit => limit.to_i)
70
+ end
65
71
  RUBY
66
72
  end
67
73
 
@@ -164,16 +170,18 @@ module ActiveRecord
164
170
  # :at_most - Exclude tags with a frequency greater than the given value
165
171
  # :on - Scope the find to only include a certain context
166
172
  def find_options_for_tag_counts(options = {})
167
- options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :on
173
+ options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :on, :id
168
174
 
169
175
  scope = scope(:find)
170
176
  start_at = sanitize_sql(["#{Tagging.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]
171
177
  end_at = sanitize_sql(["#{Tagging.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]
172
178
 
173
- type_and_context = "#{Tagging.table_name}.taggable_type = #{quote_value(base_class.name)}"
179
+ taggable_type = sanitize_sql(["#{Tagging.table_name}.taggable_type = ?", base_class.name])
180
+ taggable_id = sanitize_sql(["#{Tagging.table_name}.taggable_id = ?", options.delete(:id)]) if options[:id]
174
181
 
175
182
  conditions = [
176
- type_and_context,
183
+ taggable_type,
184
+ taggable_id,
177
185
  options[:conditions],
178
186
  start_at,
179
187
  end_at
@@ -197,7 +205,7 @@ module ActiveRecord
197
205
  :joins => joins.join(" "),
198
206
  :conditions => conditions,
199
207
  :group => group_by
200
- }.update(options)
208
+ }
201
209
  end
202
210
 
203
211
  def is_taggable?
@@ -254,8 +262,8 @@ module ActiveRecord
254
262
  add_custom_context(context)
255
263
  end
256
264
 
257
- def tag_counts_on(context,options={})
258
- self.class.tag_counts_on(context,{:conditions => ["#{Tag.table_name}.name IN (?)", tag_list_on(context)]}.reverse_merge!(options))
265
+ def tag_counts_on(context, options={})
266
+ self.class.tag_counts_on(context, options.merge(:id => self.id))
259
267
  end
260
268
 
261
269
  def related_tags_for(context, klass, options = {})
@@ -290,7 +298,7 @@ module ActiveRecord
290
298
  next unless instance_variable_get("@#{tag_type.singularize}_list")
291
299
  owner = instance_variable_get("@#{tag_type.singularize}_list").owner
292
300
  new_tag_names = instance_variable_get("@#{tag_type.singularize}_list") - tags_on(tag_type).map(&:name)
293
- old_tags = tags_on(tag_type).reject { |tag| instance_variable_get("@#{tag_type.singularize}_list").include?(tag.name) }
301
+ old_tags = tags_on(tag_type, owner).reject { |tag| instance_variable_get("@#{tag_type.singularize}_list").include?(tag.name) }
294
302
 
295
303
  self.class.transaction do
296
304
  base_tags.delete(*old_tags) if old_tags.any?
@@ -315,4 +323,4 @@ module ActiveRecord
315
323
  end
316
324
  end
317
325
  end
318
- end
326
+ end
@@ -105,6 +105,17 @@ describe "Taggable" do
105
105
  bob.save
106
106
  TaggableModel.find_tagged_with("spinning", :on => :rotors).should_not be_empty
107
107
  end
108
+
109
+ it "should be able to use named scopes to chain tag finds" do
110
+ bob = TaggableModel.create(:name => "Bob", :tag_list => "fitter, happier, more productive", :skill_list => "ruby, rails, css")
111
+ frank = TaggableModel.create(:name => "Frank", :tag_list => "weaker, depressed, inefficient", :skill_list => "ruby, rails, css")
112
+ steve = TaggableModel.create(:name => 'Steve', :tag_list => 'fitter, happier, more productive', :skill_list => 'c++, java, python')
113
+
114
+ # Let's only find those productive Rails developers
115
+ TaggableModel.tagged_with('rails', :on => :skills).all(:order => 'taggable_models.name').should == [bob, frank]
116
+ TaggableModel.tagged_with('happier', :on => :tags).all(:order => 'taggable_models.name').should == [bob, steve]
117
+ TaggableModel.tagged_with('rails', :on => :skills).tagged_with('happier', :on => :tags).should == [bob]
118
+ end
108
119
 
109
120
  describe "Single Table Inheritance" do
110
121
  before do
@@ -133,4 +144,4 @@ describe "Taggable" do
133
144
  AlteredInheritingTaggableModel.find_tagged_with("fork", :on => :parts).first.should == @inherited_different
134
145
  end
135
146
  end
136
- end
147
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mbleigh-acts-as-taggable-on
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh