acts-as-taggable-on 6.0.0 → 6.5.0

Sign up to get free protection for your applications and to get access to all the features.
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