acts-as-taggable-on 6.0.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -7
  3. data/Appraisals +4 -0
  4. data/CHANGELOG.md +179 -140
  5. data/README.md +10 -1
  6. data/acts-as-taggable-on.gemspec +2 -2
  7. data/db/migrate/1_acts_as_taggable_on_migration.rb +8 -7
  8. data/db/migrate/2_add_missing_unique_indices.rb +8 -8
  9. data/db/migrate/3_add_taggings_counter_cache_to_tags.rb +3 -3
  10. data/db/migrate/4_add_missing_taggable_index.rb +2 -2
  11. data/db/migrate/5_change_collation_for_tag_names.rb +1 -1
  12. data/db/migrate/6_add_missing_indexes_on_taggings.rb +9 -9
  13. data/gemfiles/activerecord_5.0.gemfile +2 -4
  14. data/gemfiles/activerecord_5.1.gemfile +2 -4
  15. data/gemfiles/activerecord_5.2.gemfile +2 -4
  16. data/gemfiles/activerecord_6.0.gemfile +21 -0
  17. data/lib/acts-as-taggable-on.rb +5 -1
  18. data/lib/acts_as_taggable_on/tag.rb +9 -18
  19. data/lib/acts_as_taggable_on/taggable/cache.rb +38 -34
  20. data/lib/acts_as_taggable_on/taggable/collection.rb +8 -6
  21. data/lib/acts_as_taggable_on/taggable/core.rb +11 -5
  22. data/lib/acts_as_taggable_on/taggable/tag_list_type.rb +4 -0
  23. data/lib/acts_as_taggable_on/tagging.rb +3 -1
  24. data/lib/acts_as_taggable_on/utils.rb +4 -0
  25. data/lib/acts_as_taggable_on/version.rb +1 -2
  26. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +4 -12
  27. data/spec/acts_as_taggable_on/caching_spec.rb +16 -10
  28. data/spec/acts_as_taggable_on/single_table_inheritance_spec.rb +12 -7
  29. data/spec/acts_as_taggable_on/taggable_spec.rb +9 -9
  30. data/spec/acts_as_taggable_on/tagger_spec.rb +2 -2
  31. data/spec/internal/app/models/altered_inheriting_taggable_model.rb +2 -0
  32. data/spec/internal/app/models/cached_model_with_array.rb +6 -0
  33. data/spec/internal/app/models/columns_override_model.rb +5 -0
  34. data/spec/internal/app/models/company.rb +1 -1
  35. data/spec/internal/app/models/inheriting_taggable_model.rb +2 -0
  36. data/spec/internal/app/models/market.rb +1 -1
  37. data/spec/internal/app/models/non_standard_id_taggable_model.rb +1 -1
  38. data/spec/internal/app/models/student.rb +2 -0
  39. data/spec/internal/app/models/taggable_model.rb +1 -0
  40. data/spec/internal/app/models/user.rb +1 -1
  41. data/spec/internal/db/schema.rb +11 -5
  42. data/spec/spec_helper.rb +0 -1
  43. data/spec/support/database.rb +3 -3
  44. metadata +16 -9
  45. data/spec/internal/app/models/models.rb +0 -90
@@ -94,16 +94,18 @@ module ActsAsTaggableOn::Taggable
94
94
  ## Generate conditions:
95
95
  options[:conditions] = sanitize_sql(options[:conditions]) if options[:conditions]
96
96
 
97
- ## Generate joins:
98
- taggable_join = "INNER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id"
99
- taggable_join << " AND #{table_name}.#{inheritance_column} = '#{name}'" unless descends_from_active_record? # Current model is STI descendant, so add type checking to the join condition
100
-
101
97
  ## Generate scope:
102
98
  tagging_scope = ActsAsTaggableOn::Tagging.select("#{ActsAsTaggableOn::Tagging.table_name}.tag_id, COUNT(#{ActsAsTaggableOn::Tagging.table_name}.tag_id) AS tags_count")
103
99
  tag_scope = ActsAsTaggableOn::Tag.select("#{ActsAsTaggableOn::Tag.table_name}.*, #{ActsAsTaggableOn::Tagging.table_name}.tags_count AS count").order(options[:order]).limit(options[:limit])
104
100
 
105
- # Joins and conditions
106
- tagging_scope = tagging_scope.joins(taggable_join)
101
+ # Current model is STI descendant, so add type checking to the join condition
102
+ unless descends_from_active_record?
103
+ taggable_join = "INNER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id"
104
+ taggable_join << " AND #{table_name}.#{inheritance_column} = '#{name}'"
105
+ tagging_scope = tagging_scope.joins(taggable_join)
106
+ end
107
+
108
+ # Conditions
107
109
  tagging_conditions(options).each { |condition| tagging_scope = tagging_scope.where(condition) }
108
110
  tag_scope = tag_scope.where(options[:conditions])
109
111
 
@@ -1,4 +1,5 @@
1
1
  require_relative 'tagged_with_query'
2
+ require_relative 'tag_list_type'
2
3
 
3
4
  module ActsAsTaggableOn::Taggable
4
5
  module Core
@@ -38,7 +39,7 @@ module ActsAsTaggableOn::Taggable
38
39
  through: context_taggings,
39
40
  source: :tag
40
41
 
41
- attribute "#{tags_type.singularize}_list".to_sym, ActiveModel::Type::Value.new
42
+ attribute "#{tags_type.singularize}_list".to_sym, ActsAsTaggableOn::Taggable::TagListType.new
42
43
  end
43
44
 
44
45
  taggable_mixin.class_eval <<-RUBY, __FILE__, __LINE__ + 1
@@ -49,8 +50,14 @@ module ActsAsTaggableOn::Taggable
49
50
  def #{tag_type}_list=(new_tags)
50
51
  parsed_new_list = ActsAsTaggableOn.default_parser.new(new_tags).parse
51
52
 
52
- if self.class.preserve_tag_order? || parsed_new_list.sort != #{tag_type}_list.sort
53
- set_attribute_was('#{tag_type}_list', #{tag_type}_list)
53
+ if self.class.preserve_tag_order? || (parsed_new_list.sort != #{tag_type}_list.sort)
54
+ if ActsAsTaggableOn::Utils.legacy_activerecord?
55
+ set_attribute_was("#{tag_type}_list", #{tag_type}_list)
56
+ else
57
+ unless #{tag_type}_list_changed?
58
+ @attributes["#{tag_type}_list"] = ActiveModel::Attribute.from_user("#{tag_type}_list", #{tag_type}_list, ActsAsTaggableOn::Taggable::TagListType.new)
59
+ end
60
+ end
54
61
  write_attribute("#{tag_type}_list", parsed_new_list)
55
62
  end
56
63
 
@@ -103,9 +110,8 @@ module ActsAsTaggableOn::Taggable
103
110
  def tagged_with(tags, options = {})
104
111
  tag_list = ActsAsTaggableOn.default_parser.new(tags).parse
105
112
  options = options.dup
106
- empty_result = where('1 = 0')
107
113
 
108
- return empty_result if tag_list.empty?
114
+ return none if tag_list.empty?
109
115
 
110
116
  ::ActsAsTaggableOn::Taggable::TaggedWithQuery.build(self, ActsAsTaggableOn::Tag, ActsAsTaggableOn::Tagging, tag_list, options)
111
117
  end
@@ -0,0 +1,4 @@
1
+ module ActsAsTaggableOn::Taggable
2
+ class TagListType < ActiveModel::Type::Value
3
+ end
4
+ end
@@ -1,10 +1,12 @@
1
1
  module ActsAsTaggableOn
2
2
  class Tagging < ::ActiveRecord::Base #:nodoc:
3
+ self.table_name = ActsAsTaggableOn.taggings_table
4
+
3
5
  DEFAULT_CONTEXT = 'tags'
4
6
  belongs_to :tag, class_name: '::ActsAsTaggableOn::Tag', counter_cache: ActsAsTaggableOn.tags_counter
5
7
  belongs_to :taggable, polymorphic: true
6
8
 
7
- belongs_to :tagger, {polymorphic: true}.tap {|o| o.merge!(optional: true) }
9
+ belongs_to :tagger, { polymorphic: true, optional: true }
8
10
 
9
11
  scope :owned_by, ->(owner) { where(tagger: owner) }
10
12
  scope :not_owned, -> { where(tagger_id: nil, tagger_type: nil) }
@@ -24,6 +24,10 @@ module ActsAsTaggableOn
24
24
  using_postgresql? ? 'ILIKE' : 'LIKE'
25
25
  end
26
26
 
27
+ def legacy_activerecord?
28
+ ActiveRecord.version <= Gem::Version.new('5.3.0')
29
+ end
30
+
27
31
  # escape _ and % characters in strings, since these are wildcards in SQL.
28
32
  def escape_like(str)
29
33
  str.gsub(/[!%_]/) { |x| '!' + x }
@@ -1,4 +1,3 @@
1
1
  module ActsAsTaggableOn
2
- VERSION = '6.0.0'
2
+ VERSION = '6.5.0'
3
3
  end
4
-
@@ -73,14 +73,6 @@ describe 'Acts As Taggable On' do
73
73
  end
74
74
  end
75
75
 
76
- describe 'Reloading' do
77
- it 'should save a model instantiated by Model.find' do
78
- taggable = TaggableModel.create!(name: 'Taggable')
79
- found_taggable = TaggableModel.find(taggable.id)
80
- found_taggable.save
81
- end
82
- end
83
-
84
76
  describe 'Matching Contexts' do
85
77
  it 'should find objects with tags of matching contexts' do
86
78
  taggable1 = TaggableModel.create!(name: 'Taggable 1')
@@ -142,7 +134,7 @@ describe 'Acts As Taggable On' do
142
134
  taggable1.save
143
135
 
144
136
  column = TaggableModel.connection.quote_column_name("context")
145
- offer_alias = TaggableModel.connection.quote_table_name("taggings")
137
+ offer_alias = TaggableModel.connection.quote_table_name(ActsAsTaggableOn.taggings_table)
146
138
  need_alias = TaggableModel.connection.quote_table_name("need_taggings_taggable_models_join")
147
139
 
148
140
  expect(TaggableModel.joins(:offerings, :needs).to_sql).to include "#{offer_alias}.#{column}"
@@ -200,7 +192,7 @@ describe 'Acts As Taggable On' do
200
192
  its(:cached_glass_list) { should be_blank }
201
193
 
202
194
  context 'language taggings cache after update' do
203
- before { @taggable.update_attributes(language_list: 'ruby, .net') }
195
+ before { @taggable.update(language_list: 'ruby, .net') }
204
196
  subject { @taggable }
205
197
 
206
198
  its(:language_list) { should == ['ruby', '.net']}
@@ -209,7 +201,7 @@ describe 'Acts As Taggable On' do
209
201
  end
210
202
 
211
203
  context 'status taggings cache after update' do
212
- before { @taggable.update_attributes(status_list: 'happy, married') }
204
+ before { @taggable.update(status_list: 'happy, married') }
213
205
  subject { @taggable }
214
206
 
215
207
  its(:status_list) { should == ['happy', 'married'] }
@@ -222,7 +214,7 @@ describe 'Acts As Taggable On' do
222
214
 
223
215
  context 'glass taggings cache after update' do
224
216
  before do
225
- @taggable.update_attributes(glass_list: 'rectangle, aviator')
217
+ @taggable.update(glass_list: 'rectangle, aviator')
226
218
  end
227
219
 
228
220
  subject { @taggable }
@@ -31,40 +31,40 @@ describe 'Acts As Taggable On' do
31
31
  end
32
32
 
33
33
  it 'should cache tags' do
34
- @taggable.update_attributes(tag_list: 'awesome, epic')
34
+ @taggable.update(tag_list: 'awesome, epic')
35
35
  expect(@taggable.cached_tag_list).to eq('awesome, epic')
36
36
 
37
- @another_taggable.update_attributes(language_list: 'ruby, .net')
37
+ @another_taggable.update(language_list: 'ruby, .net')
38
38
  expect(@another_taggable.cached_language_list).to eq('ruby, .net')
39
39
  end
40
40
 
41
41
  it 'should keep the cache' do
42
- @taggable.update_attributes(tag_list: 'awesome, epic')
42
+ @taggable.update(tag_list: 'awesome, epic')
43
43
  @taggable = CachedModel.find(@taggable.id)
44
44
  @taggable.save!
45
45
  expect(@taggable.cached_tag_list).to eq('awesome, epic')
46
46
  end
47
47
 
48
48
  it 'should update the cache' do
49
- @taggable.update_attributes(tag_list: 'awesome, epic')
50
- @taggable.update_attributes(tag_list: 'awesome')
49
+ @taggable.update(tag_list: 'awesome, epic')
50
+ @taggable.update(tag_list: 'awesome')
51
51
  expect(@taggable.cached_tag_list).to eq('awesome')
52
52
  end
53
53
 
54
54
  it 'should remove the cache' do
55
- @taggable.update_attributes(tag_list: 'awesome, epic')
56
- @taggable.update_attributes(tag_list: '')
55
+ @taggable.update(tag_list: 'awesome, epic')
56
+ @taggable.update(tag_list: '')
57
57
  expect(@taggable.cached_tag_list).to be_blank
58
58
  end
59
59
 
60
60
  it 'should have a tag list' do
61
- @taggable.update_attributes(tag_list: 'awesome, epic')
61
+ @taggable.update(tag_list: 'awesome, epic')
62
62
  @taggable = CachedModel.find(@taggable.id)
63
63
  expect(@taggable.tag_list.sort).to eq(%w(awesome epic).sort)
64
64
  end
65
65
 
66
66
  it 'should keep the tag list' do
67
- @taggable.update_attributes(tag_list: 'awesome, epic')
67
+ @taggable.update(tag_list: 'awesome, epic')
68
68
  @taggable = CachedModel.find(@taggable.id)
69
69
  @taggable.save!
70
70
  expect(@taggable.tag_list.sort).to eq(%w(awesome epic).sort)
@@ -75,6 +75,12 @@ describe 'Acts As Taggable On' do
75
75
  CachedModel.reset_column_information
76
76
  expect(CachedModel.instance_variable_get(:@acts_as_taggable_on_cache_columns)).to eql(nil)
77
77
  end
78
+
79
+ it 'should not override a user-defined columns method' do
80
+ expect(ColumnsOverrideModel.columns.map(&:name)).not_to include('ignored_column')
81
+ ColumnsOverrideModel.acts_as_taggable
82
+ expect(ColumnsOverrideModel.columns.map(&:name)).not_to include('ignored_column')
83
+ end
78
84
  end
79
85
 
80
86
  describe 'with a custom delimiter' do
@@ -89,7 +95,7 @@ describe 'Acts As Taggable On' do
89
95
  end
90
96
 
91
97
  it 'should cache tags with custom delimiter' do
92
- @taggable.update_attributes(tag_list: 'awesome; epic')
98
+ @taggable.update(tag_list: 'awesome; epic')
93
99
  expect(@taggable.tag_list).to eq(['awesome', 'epic'])
94
100
  expect(@taggable.cached_tag_list).to eq('awesome; epic')
95
101
 
@@ -127,9 +127,9 @@ describe 'Single Table Inheritance' do
127
127
  altered_inheriting.tag_list = 'fork, spoon'
128
128
  altered_inheriting.save!
129
129
 
130
- expect(InheritingTaggableModel.tag_counts_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(bob kelso))
131
- expect(AlteredInheritingTaggableModel.tag_counts_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(fork spoon))
132
- expect(TaggableModel.tag_counts_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(bob kelso fork spoon))
130
+ expect(InheritingTaggableModel.tag_counts_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(bob kelso))
131
+ expect(AlteredInheritingTaggableModel.tag_counts_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(fork spoon))
132
+ expect(TaggableModel.tag_counts_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(bob kelso fork spoon))
133
133
  end
134
134
 
135
135
  it 'should have different tags_on for inherited models' do
@@ -138,9 +138,9 @@ describe 'Single Table Inheritance' do
138
138
  altered_inheriting.tag_list = 'fork, spoon'
139
139
  altered_inheriting.save!
140
140
 
141
- expect(InheritingTaggableModel.tags_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(bob kelso))
142
- expect(AlteredInheritingTaggableModel.tags_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(fork spoon))
143
- expect(TaggableModel.tags_on(:tags, order: 'tags.id').map(&:name)).to eq(%w(bob kelso fork spoon))
141
+ expect(InheritingTaggableModel.tags_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(bob kelso))
142
+ expect(AlteredInheritingTaggableModel.tags_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(fork spoon))
143
+ expect(TaggableModel.tags_on(:tags, order: "#{ActsAsTaggableOn.tags_table}.id").map(&:name)).to eq(%w(bob kelso fork spoon))
144
144
  end
145
145
 
146
146
  it 'should store same tag without validation conflict' do
@@ -150,7 +150,12 @@ describe 'Single Table Inheritance' do
150
150
  inheriting_model.tag_list = 'one'
151
151
  inheriting_model.save!
152
152
 
153
- inheriting_model.update_attributes! name: 'foo'
153
+ inheriting_model.update! name: 'foo'
154
+ end
155
+
156
+ it "should only join with taggable's table to check type for inherited models" do
157
+ expect(TaggableModel.tag_counts_on(:tags).to_sql).to_not match /INNER JOIN taggable_models ON/
158
+ expect(InheritingTaggableModel.tag_counts_on(:tags).to_sql).to match /INNER JOIN taggable_models ON/
154
159
  end
155
160
  end
156
161
 
@@ -200,8 +200,8 @@ describe 'Taggable' do
200
200
  @taggables[1].skill_list = 'css'
201
201
  @taggables.each { |taggable| taggable.save }
202
202
 
203
- @found_taggables_by_tag = TaggableModel.joins(:tags).where(tags: {name: ['bob']})
204
- @found_taggables_by_skill = TaggableModel.joins(:skills).where(tags: {name: ['ruby']})
203
+ @found_taggables_by_tag = TaggableModel.joins(:tags).where(ActsAsTaggableOn.tags_table => {name: ['bob']})
204
+ @found_taggables_by_skill = TaggableModel.joins(:skills).where(ActsAsTaggableOn.tags_table => {name: ['ruby']})
205
205
 
206
206
  expect(@found_taggables_by_tag).to include @taggables[0]
207
207
  expect(@found_taggables_by_tag).to_not include @taggables[1]
@@ -338,7 +338,7 @@ describe 'Taggable' do
338
338
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
339
339
 
340
340
  expect(TaggableModel.all_tag_counts).to_not be_empty
341
- expect(TaggableModel.all_tag_counts(order: 'tags.id').first.count).to eq(3) # ruby
341
+ expect(TaggableModel.all_tag_counts(order: "#{ActsAsTaggableOn.tags_table}.id").first.count).to eq(3) # ruby
342
342
  end
343
343
 
344
344
  it 'should be able to get all tags on model as whole' do
@@ -347,7 +347,7 @@ describe 'Taggable' do
347
347
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
348
348
 
349
349
  expect(TaggableModel.all_tags).to_not be_empty
350
- expect(TaggableModel.all_tags(order: 'tags.id').first.name).to eq('ruby')
350
+ expect(TaggableModel.all_tags(order: "#{ActsAsTaggableOn.tags_table}.id").first.name).to eq('ruby')
351
351
  end
352
352
 
353
353
  it 'should be able to use named scopes to chain tag finds by any tags by context' do
@@ -369,7 +369,7 @@ describe 'Taggable' do
369
369
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
370
370
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
371
371
 
372
- expect(TaggableModel.tagged_with('ruby').tag_counts(order: 'tags.id').first.count).to eq(2) # ruby
372
+ expect(TaggableModel.tagged_with('ruby').tag_counts(order: "#{ActsAsTaggableOn.tags_table}.id").first.count).to eq(2) # ruby
373
373
  expect(TaggableModel.tagged_with('ruby').skill_counts.first.count).to eq(1) # ruby
374
374
  end
375
375
 
@@ -378,7 +378,7 @@ describe 'Taggable' do
378
378
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
379
379
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
380
380
 
381
- expect(TaggableModel.tagged_with('ruby').all_tag_counts(order: 'tags.id').first.count).to eq(3) # ruby
381
+ expect(TaggableModel.tagged_with('ruby').all_tag_counts(order: "#{ActsAsTaggableOn.tags_table}.id").first.count).to eq(3) # ruby
382
382
  end
383
383
 
384
384
  it 'should be able to get all scoped tags' do
@@ -386,7 +386,7 @@ describe 'Taggable' do
386
386
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
387
387
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
388
388
 
389
- expect(TaggableModel.tagged_with('ruby').all_tags(order: 'tags.id').first.name).to eq('ruby')
389
+ expect(TaggableModel.tagged_with('ruby').all_tags(order: "#{ActsAsTaggableOn.tags_table}.id").first.name).to eq('ruby')
390
390
  end
391
391
 
392
392
  it 'should only return tag counts for the available scope' do
@@ -541,7 +541,7 @@ describe 'Taggable' do
541
541
 
542
542
  it 'should not delete tags if not updated' do
543
543
  model = TaggableModel.create(name: 'foo', tag_list: 'ruby, rails, programming')
544
- model.update_attributes(name: 'bar')
544
+ model.update(name: 'bar')
545
545
  model.reload
546
546
  expect(model.tag_list.sort).to eq(%w(ruby rails programming).sort)
547
547
  end
@@ -672,7 +672,7 @@ describe 'Taggable' do
672
672
  # NOTE: type column supports an STI Tag subclass in the test suite, though
673
673
  # isn't included by default in the migration generator
674
674
  expect(@taggable.grouped_column_names_for(ActsAsTaggableOn::Tag))
675
- .to eq('tags.id, tags.name, tags.taggings_count, tags.type')
675
+ .to eq("#{ActsAsTaggableOn.tags_table}.id, #{ActsAsTaggableOn.tags_table}.name, #{ActsAsTaggableOn.tags_table}.taggings_count, #{ActsAsTaggableOn.tags_table}.type")
676
676
  end
677
677
 
678
678
  it 'should return all column names joined for TaggableModel GROUP clause' do
@@ -112,7 +112,7 @@ describe 'Tagger' do
112
112
  end
113
113
 
114
114
  it 'should not lose tags' do
115
- @taggable.update_attributes(tag_list: 'ruby')
115
+ @taggable.update(tag_list: 'ruby')
116
116
  @user.tag(@taggable, with: 'ruby, scheme', on: :tags)
117
117
 
118
118
  [@taggable, @user].each(&:reload)
@@ -120,7 +120,7 @@ describe 'Tagger' do
120
120
  expect(@taggable.all_tags_list.sort).to eq(%w(ruby scheme).sort)
121
121
 
122
122
  expect(-> {
123
- @taggable.update_attributes(tag_list: '')
123
+ @taggable.update(tag_list: '')
124
124
  }).to change(ActsAsTaggableOn::Tagging, :count).by(-1)
125
125
 
126
126
  expect(@taggable.tag_list).to be_empty
@@ -1,3 +1,5 @@
1
+ require_relative 'taggable_model'
2
+
1
3
  class AlteredInheritingTaggableModel < TaggableModel
2
4
  acts_as_taggable_on :parts
3
5
  end
@@ -2,4 +2,10 @@ if using_postgresql?
2
2
  class CachedModelWithArray < ActiveRecord::Base
3
3
  acts_as_taggable
4
4
  end
5
+ if postgresql_support_json?
6
+ class TaggableModelWithJson < ActiveRecord::Base
7
+ acts_as_taggable
8
+ acts_as_taggable_on :skills
9
+ end
10
+ end
5
11
  end
@@ -0,0 +1,5 @@
1
+ class ColumnsOverrideModel < ActiveRecord::Base
2
+ def self.columns
3
+ super.reject { |c| c.name == 'ignored_column' }
4
+ end
5
+ end
@@ -12,4 +12,4 @@ class Company < ActiveRecord::Base
12
12
  super
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -1,2 +1,4 @@
1
+ require_relative 'taggable_model'
2
+
1
3
  class InheritingTaggableModel < TaggableModel
2
4
  end
@@ -1,2 +1,2 @@
1
1
  class Market < ActsAsTaggableOn::Tag
2
- end
2
+ end
@@ -1,5 +1,5 @@
1
1
  class NonStandardIdTaggableModel < ActiveRecord::Base
2
- self.primary_key = 'an_id'
2
+ self.primary_key = :an_id
3
3
  acts_as_taggable
4
4
  acts_as_taggable_on :languages
5
5
  acts_as_taggable_on :skills
@@ -1,2 +1,4 @@
1
+ require_relative 'user'
2
+
1
3
  class Student < User
2
4
  end
@@ -6,6 +6,7 @@ class TaggableModel < ActiveRecord::Base
6
6
  has_many :untaggable_models
7
7
 
8
8
  attr_reader :tag_list_submethod_called
9
+
9
10
  def tag_list=(v)
10
11
  @tag_list_submethod_called = true
11
12
  super
@@ -1,3 +1,3 @@
1
1
  class User < ActiveRecord::Base
2
2
  acts_as_tagger
3
- end
3
+ end
@@ -1,12 +1,12 @@
1
1
  ActiveRecord::Schema.define version: 0 do
2
- create_table :tags, force: true do |t|
2
+ create_table ActsAsTaggableOn.tags_table, force: true do |t|
3
3
  t.string :name
4
4
  t.integer :taggings_count, default: 0
5
5
  t.string :type
6
6
  end
7
- add_index 'tags', ['name'], name: 'index_tags_on_name', unique: true
7
+ add_index ActsAsTaggableOn.tags_table, ['name'], name: 'index_tags_on_name', unique: true
8
8
 
9
- create_table :taggings, force: true do |t|
9
+ create_table ActsAsTaggableOn.taggings_table, force: true do |t|
10
10
  t.integer :tag_id
11
11
 
12
12
  # You should make sure that the column created is
@@ -23,10 +23,10 @@ ActiveRecord::Schema.define version: 0 do
23
23
 
24
24
  t.datetime :created_at
25
25
  end
26
- add_index 'taggings',
26
+ add_index ActsAsTaggableOn.taggings_table,
27
27
  ['tag_id', 'taggable_id', 'taggable_type', 'context', 'tagger_id', 'tagger_type'],
28
28
  unique: true, name: 'taggings_idx'
29
- add_index 'taggings', :tag_id , name: 'index_taggings_on_tag_id'
29
+ add_index ActsAsTaggableOn.taggings_table, :tag_id , name: 'index_taggings_on_tag_id'
30
30
 
31
31
  # above copied from
32
32
  # generators/acts_as_taggable_on/migration/migration_generator
@@ -36,6 +36,12 @@ ActiveRecord::Schema.define version: 0 do
36
36
  t.column :type, :string
37
37
  end
38
38
 
39
+ create_table :columns_override_models, force: true do |t|
40
+ t.column :name, :string
41
+ t.column :type, :string
42
+ t.column :ignored_column, :string
43
+ end
44
+
39
45
  create_table :non_standard_id_taggable_models, primary_key: 'an_id', force: true do |t|
40
46
  t.column :name, :string
41
47
  t.column :type, :string