acts-as-taggable-on 4.0.0.pre → 7.0.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 (65) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.travis.yml +28 -15
  4. data/Appraisals +12 -10
  5. data/CHANGELOG.md +200 -71
  6. data/CONTRIBUTING.md +13 -0
  7. data/Gemfile +1 -1
  8. data/README.md +68 -28
  9. data/acts-as-taggable-on.gemspec +2 -6
  10. data/db/migrate/1_acts_as_taggable_on_migration.rb +14 -8
  11. data/db/migrate/2_add_missing_unique_indices.rb +14 -9
  12. data/db/migrate/3_add_taggings_counter_cache_to_tags.rb +9 -4
  13. data/db/migrate/4_add_missing_taggable_index.rb +8 -3
  14. data/db/migrate/5_change_collation_for_tag_names.rb +7 -2
  15. data/db/migrate/6_add_missing_indexes_on_taggings.rb +22 -0
  16. data/gemfiles/activerecord_5.0.gemfile +11 -5
  17. data/gemfiles/activerecord_5.1.gemfile +21 -0
  18. data/gemfiles/activerecord_5.2.gemfile +21 -0
  19. data/gemfiles/activerecord_6.0.gemfile +21 -0
  20. data/gemfiles/activerecord_6.1.gemfile +23 -0
  21. data/lib/acts-as-taggable-on.rb +6 -2
  22. data/lib/acts_as_taggable_on/tag.rb +17 -23
  23. data/lib/acts_as_taggable_on/tag_list.rb +1 -0
  24. data/lib/acts_as_taggable_on/taggable.rb +0 -1
  25. data/lib/acts_as_taggable_on/taggable/cache.rb +38 -34
  26. data/lib/acts_as_taggable_on/taggable/collection.rb +9 -7
  27. data/lib/acts_as_taggable_on/taggable/core.rb +41 -181
  28. data/lib/acts_as_taggable_on/taggable/ownership.rb +16 -5
  29. data/lib/acts_as_taggable_on/taggable/related.rb +1 -1
  30. data/lib/acts_as_taggable_on/taggable/tag_list_type.rb +4 -0
  31. data/lib/acts_as_taggable_on/taggable/tagged_with_query.rb +16 -0
  32. data/lib/acts_as_taggable_on/taggable/tagged_with_query/all_tags_query.rb +111 -0
  33. data/lib/acts_as_taggable_on/taggable/tagged_with_query/any_tags_query.rb +70 -0
  34. data/lib/acts_as_taggable_on/taggable/tagged_with_query/exclude_tags_query.rb +82 -0
  35. data/lib/acts_as_taggable_on/taggable/tagged_with_query/query_base.rb +61 -0
  36. data/lib/acts_as_taggable_on/tagger.rb +3 -3
  37. data/lib/acts_as_taggable_on/tagging.rb +6 -3
  38. data/lib/acts_as_taggable_on/utils.rb +4 -4
  39. data/lib/acts_as_taggable_on/version.rb +1 -2
  40. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +4 -12
  41. data/spec/acts_as_taggable_on/caching_spec.rb +34 -10
  42. data/spec/acts_as_taggable_on/{taggable/dirty_spec.rb → dirty_spec.rb} +28 -13
  43. data/spec/acts_as_taggable_on/single_table_inheritance_spec.rb +28 -8
  44. data/spec/acts_as_taggable_on/taggable_spec.rb +16 -13
  45. data/spec/acts_as_taggable_on/tagger_spec.rb +2 -2
  46. data/spec/internal/app/models/altered_inheriting_taggable_model.rb +2 -0
  47. data/spec/internal/app/models/cached_model_with_array.rb +6 -0
  48. data/spec/internal/app/models/columns_override_model.rb +5 -0
  49. data/spec/internal/app/models/company.rb +1 -1
  50. data/spec/internal/app/models/inheriting_taggable_model.rb +2 -0
  51. data/spec/internal/app/models/market.rb +1 -1
  52. data/spec/internal/app/models/non_standard_id_taggable_model.rb +1 -1
  53. data/spec/internal/app/models/student.rb +2 -0
  54. data/spec/internal/app/models/taggable_model.rb +1 -0
  55. data/spec/internal/app/models/user.rb +1 -1
  56. data/spec/internal/db/schema.rb +14 -5
  57. data/spec/spec_helper.rb +0 -1
  58. data/spec/support/database.rb +4 -4
  59. metadata +30 -61
  60. data/db/migrate/6_add_missing_indexes.rb +0 -12
  61. data/gemfiles/activerecord_4.0.gemfile +0 -16
  62. data/gemfiles/activerecord_4.1.gemfile +0 -16
  63. data/gemfiles/activerecord_4.2.gemfile +0 -15
  64. data/lib/acts_as_taggable_on/taggable/dirty.rb +0 -36
  65. data/spec/internal/app/models/models.rb +0 -90
@@ -1,4 +1,3 @@
1
1
  module ActsAsTaggableOn
2
- VERSION = '4.0.0.pre'
2
+ VERSION = '7.0.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
 
@@ -99,6 +105,24 @@ describe 'Acts As Taggable On' do
99
105
  end
100
106
  end
101
107
 
108
+ describe 'Cache methods initialization on new models' do
109
+ before(:all) do
110
+ ActiveRecord::Base.connection.execute(
111
+ 'INSERT INTO cache_methods_injected_models (cached_tag_list) VALUES (\'ciao\')'
112
+ )
113
+ class CacheMethodsInjectedModel < ActiveRecord::Base
114
+ acts_as_taggable
115
+ end
116
+ end
117
+ after(:all) { Object.send(:remove_const, :CacheMethodsInjectedModel) }
118
+
119
+ it 'cached_tag_list_on? get injected correctly' do
120
+ expect do
121
+ CacheMethodsInjectedModel.first.tag_list
122
+ end.not_to raise_error
123
+ end
124
+ end
125
+
102
126
  describe 'CachingWithArray' do
103
127
  pending '#TODO'
104
128
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  require 'spec_helper'
3
3
 
4
- describe ActsAsTaggableOn::Taggable::Dirty do
4
+ describe 'Dirty behavior of taggable objects' do
5
5
  context 'with un-contexted tags' do
6
6
  before(:each) do
7
7
  @taggable = TaggableModel.create(tag_list: 'awesome, epic')
@@ -14,19 +14,27 @@ describe ActsAsTaggableOn::Taggable::Dirty do
14
14
  end
15
15
 
16
16
  it 'should show changes of dirty object' do
17
- expect(@taggable.changes).to eq({'tag_list' => ['awesome, epic', ['one']]})
17
+ expect(@taggable.changes).to eq({'tag_list' => [['awesome', 'epic'], ['one']]})
18
18
  end
19
19
 
20
- it 'flags tag_list as changed' do
21
- expect(@taggable.tag_list_changed?).to be_truthy
20
+ it 'should show changes of freshly initialized dirty object' do
21
+ taggable = TaggableModel.find(@taggable.id)
22
+ taggable.tag_list = 'one'
23
+ expect(taggable.changes).to eq({'tag_list' => [['awesome', 'epic'], ['one']]})
24
+ end
25
+
26
+ if Rails.version >= "5.1"
27
+ it 'flags tag_list as changed' do
28
+ expect(@taggable.will_save_change_to_tag_list?).to be_truthy
29
+ end
22
30
  end
23
31
 
24
32
  it 'preserves original value' do
25
- expect(@taggable.tag_list_was).to eq('awesome, epic')
33
+ expect(@taggable.tag_list_was).to eq(['awesome', 'epic'])
26
34
  end
27
35
 
28
36
  it 'shows what the change was' do
29
- expect(@taggable.tag_list_change).to eq(['awesome, epic', ['one']])
37
+ expect(@taggable.tag_list_change).to eq([['awesome', 'epic'], ['one']])
30
38
  end
31
39
 
32
40
  context 'without order' do
@@ -90,7 +98,7 @@ describe ActsAsTaggableOn::Taggable::Dirty do
90
98
  end
91
99
 
92
100
  it 'should show changes of dirty object' do
93
- expect(@taggable.changes).to eq({'language_list' => ['awesome, epic', ['one']]})
101
+ expect(@taggable.changes).to eq({'language_list' => [['awesome', 'epic'], ['one']]})
94
102
  end
95
103
 
96
104
  it 'flags language_list as changed' do
@@ -98,15 +106,11 @@ describe ActsAsTaggableOn::Taggable::Dirty do
98
106
  end
99
107
 
100
108
  it 'preserves original value' do
101
- expect(@taggable.language_list_was).to eq('awesome, epic')
109
+ expect(@taggable.language_list_was).to eq(['awesome', 'epic'])
102
110
  end
103
111
 
104
112
  it 'shows what the change was' do
105
- expect(@taggable.language_list_change).to eq(['awesome, epic', ['one']])
106
- end
107
-
108
- it 'shows what the changes were' do
109
- expect(@taggable.language_list_changes).to eq(['awesome, epic', ['one']])
113
+ expect(@taggable.language_list_change).to eq([['awesome', 'epic'], ['one']])
110
114
  end
111
115
  end
112
116
 
@@ -123,5 +127,16 @@ describe ActsAsTaggableOn::Taggable::Dirty do
123
127
  expect(@taggable.changes).to be_empty
124
128
  end
125
129
  end
130
+
131
+ context 'when language_list changed by association' do
132
+ let(:tag) { ActsAsTaggableOn::Tag.new(name: 'one') }
133
+
134
+ it 'flags language_list as changed' do
135
+ expect(@taggable.changes).to be_empty
136
+ @taggable.languages << tag
137
+ expect(@taggable.language_list_changed?).to be_truthy
138
+ end
139
+ end
140
+
126
141
  end
127
142
  end
@@ -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
 
@@ -170,11 +175,27 @@ describe 'Single Table Inheritance' do
170
175
  expect(taggable.tags_from(student)).to eq(%w(ruby scheme))
171
176
  end
172
177
 
178
+ it 'returns all owner tags on the taggable' do
179
+ student.tag(taggable, with: 'ruby, scheme', on: :tags)
180
+ student.tag(taggable, with: 'skill_one', on: :skills)
181
+ student.tag(taggable, with: 'english, spanish', on: :language)
182
+ expect(taggable.owner_tags(student).count).to eq(5)
183
+ expect(taggable.owner_tags(student).sort == %w(english ruby scheme skill_one spanish))
184
+ end
185
+
186
+
173
187
  it 'returns owner tags on the tagger' do
174
188
  student.tag(taggable, with: 'ruby, scheme', on: :tags)
175
189
  expect(taggable.owner_tags_on(student, :tags).count).to eq(2)
176
190
  end
177
191
 
192
+ it 'returns owner tags on the taggable for an array of contexts' do
193
+ student.tag(taggable, with: 'ruby, scheme', on: :tags)
194
+ student.tag(taggable, with: 'skill_one, skill_two', on: :skills)
195
+ expect(taggable.owner_tags_on(student, [:tags, :skills]).count).to eq(4)
196
+ expect(taggable.owner_tags_on(student, [:tags, :skills]).sort == %w(ruby scheme skill_one skill_two))
197
+ end
198
+
178
199
  it 'should scope objects returned by tagged_with by owners' do
179
200
  student.tag(taggable, with: 'ruby, scheme', on: :tags)
180
201
  expect(TaggableModel.tagged_with(%w(ruby scheme), owned_by: student).count).to eq(1)
@@ -208,4 +229,3 @@ describe 'Single Table Inheritance' do
208
229
  end
209
230
  end
210
231
  end
211
-
@@ -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]
@@ -247,7 +247,7 @@ describe 'Taggable' do
247
247
  expect(TaggableModel.tagged_with("ruby", :start_at => today, :end_at => tomorrow).count).to eq(1)
248
248
  end
249
249
 
250
- it "shouldn't be able to find a tag outside date range" do
250
+ it "shouldn't be able to find a tag outside date range" do
251
251
  @taggable.skill_list = "ruby"
252
252
  @taggable.save
253
253
 
@@ -255,14 +255,17 @@ describe 'Taggable' do
255
255
  end
256
256
 
257
257
  it 'should be able to find by tag with context' do
258
- @taggable.skill_list = 'ruby, rails, css'
259
- @taggable.tag_list = 'bob, charlie'
258
+ @taggable.skill_list = 'ruby, rails, css, julia'
259
+ @taggable.tag_list = 'bob, charlie, julia'
260
260
  @taggable.save
261
261
 
262
262
  expect(TaggableModel.tagged_with('ruby').first).to eq(@taggable)
263
263
  expect(TaggableModel.tagged_with('ruby, css').first).to eq(@taggable)
264
264
  expect(TaggableModel.tagged_with('bob', on: :skills).first).to_not eq(@taggable)
265
265
  expect(TaggableModel.tagged_with('bob', on: :tags).first).to eq(@taggable)
266
+ expect(TaggableModel.tagged_with('julia', on: :skills).size).to eq(1)
267
+ expect(TaggableModel.tagged_with('julia', on: :tags).size).to eq(1)
268
+ expect(TaggableModel.tagged_with('julia', on: nil).size).to eq(2)
266
269
  end
267
270
 
268
271
  it 'should not care about case' do
@@ -335,7 +338,7 @@ describe 'Taggable' do
335
338
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
336
339
 
337
340
  expect(TaggableModel.all_tag_counts).to_not be_empty
338
- 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
339
342
  end
340
343
 
341
344
  it 'should be able to get all tags on model as whole' do
@@ -344,7 +347,7 @@ describe 'Taggable' do
344
347
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
345
348
 
346
349
  expect(TaggableModel.all_tags).to_not be_empty
347
- 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')
348
351
  end
349
352
 
350
353
  it 'should be able to use named scopes to chain tag finds by any tags by context' do
@@ -366,7 +369,7 @@ describe 'Taggable' do
366
369
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
367
370
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
368
371
 
369
- 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
370
373
  expect(TaggableModel.tagged_with('ruby').skill_counts.first.count).to eq(1) # ruby
371
374
  end
372
375
 
@@ -375,7 +378,7 @@ describe 'Taggable' do
375
378
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
376
379
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
377
380
 
378
- 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
379
382
  end
380
383
 
381
384
  it 'should be able to get all scoped tags' do
@@ -383,7 +386,7 @@ describe 'Taggable' do
383
386
  TaggableModel.create(name: 'Frank', tag_list: 'ruby, rails')
384
387
  TaggableModel.create(name: 'Charlie', skill_list: 'ruby')
385
388
 
386
- 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')
387
390
  end
388
391
 
389
392
  it 'should only return tag counts for the available scope' do
@@ -474,7 +477,7 @@ describe 'Taggable' do
474
477
 
475
478
  expect(TaggableModel.tagged_with(%w(bob tricia), wild: true, any: true).to_a.sort_by { |o| o.id }).to eq([bob, frank, steve])
476
479
  expect(TaggableModel.tagged_with(%w(bob tricia), wild: true, exclude: true).to_a).to eq([jim])
477
- expect(TaggableModel.tagged_with('ji', wild: true, any: true).to_a =~ [frank, jim])
480
+ expect(TaggableModel.tagged_with('ji', wild: true, any: true).to_a).to match_array([frank, jim])
478
481
  end
479
482
  end
480
483
 
@@ -538,7 +541,7 @@ describe 'Taggable' do
538
541
 
539
542
  it 'should not delete tags if not updated' do
540
543
  model = TaggableModel.create(name: 'foo', tag_list: 'ruby, rails, programming')
541
- model.update_attributes(name: 'bar')
544
+ model.update(name: 'bar')
542
545
  model.reload
543
546
  expect(model.tag_list.sort).to eq(%w(ruby rails programming).sort)
544
547
  end
@@ -669,7 +672,7 @@ describe 'Taggable' do
669
672
  # NOTE: type column supports an STI Tag subclass in the test suite, though
670
673
  # isn't included by default in the migration generator
671
674
  expect(@taggable.grouped_column_names_for(ActsAsTaggableOn::Tag))
672
- .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")
673
676
  end
674
677
 
675
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