polymorphic_integer_type 2.2.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +9 -11
  3. data/Rakefile +11 -0
  4. data/gemfiles/Gemfile.rails-5.0-stable +8 -0
  5. data/gemfiles/Gemfile.rails-5.0-stable.lock +74 -0
  6. data/gemfiles/Gemfile.rails-5.1-stable +7 -0
  7. data/gemfiles/Gemfile.rails-5.1-stable.lock +74 -0
  8. data/gemfiles/Gemfile.rails-5.2-stable +7 -0
  9. data/gemfiles/Gemfile.rails-5.2-stable.lock +74 -0
  10. data/gemfiles/Gemfile.rails-6-0-stable +7 -0
  11. data/gemfiles/Gemfile.rails-6-0-stable.lock +74 -0
  12. data/lib/polymorphic_integer_type.rb +8 -4
  13. data/lib/polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension.rb +38 -0
  14. data/lib/polymorphic_integer_type/activerecord_5_0_0/polymorphic_array_value_extension.rb +34 -0
  15. data/lib/polymorphic_integer_type/belongs_to_polymorphic_association_extension.rb +12 -0
  16. data/lib/polymorphic_integer_type/extensions.rb +8 -31
  17. data/lib/polymorphic_integer_type/mapping.rb +1 -1
  18. data/lib/polymorphic_integer_type/module_generator.rb +34 -0
  19. data/lib/polymorphic_integer_type/version.rb +1 -1
  20. data/polymorphic_integer_type.gemspec +2 -2
  21. data/spec/polymorphic_integer_type_spec.rb +94 -20
  22. data/spec/spec_helper.rb +11 -2
  23. data/spec/support/configuration.rb +2 -2
  24. data/spec/support/link.rb +0 -8
  25. data/spec/support/migrations/6_create_plant_table.rb +17 -0
  26. data/spec/support/migrations/7_create_activity_table.rb +15 -0
  27. data/spec/support/namespaced_activity.rb +11 -0
  28. data/spec/support/namespaced_animal.rb +5 -1
  29. data/spec/support/namespaced_plant.rb +11 -0
  30. metadata +31 -14
  31. data/lib/polymorphic_integer_type/polymorphic_array_value_extension.rb +0 -20
  32. data/lib/polymorphic_integer_type/predicate_builder_extension.rb +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f818991a7fa6b0835e39fd4133d6bc7c163e6d4e
4
- data.tar.gz: 2e2715bfdb1d56e36d142b9c5b9bebf785795ab3
2
+ SHA256:
3
+ metadata.gz: 96fa454bca5e242711a9cc17183c3dbfe7b8c9303bd0bbe1cd246d030761639d
4
+ data.tar.gz: 536c3c02769ef0e020e300225e9e1cf453235d5341adc6f98cd973e1d7ea79d1
5
5
  SHA512:
6
- metadata.gz: d9616ed1ea9e3bd402b4632b0c3b9aa4355a282424941f1538a86498420f84f91e06e9471cf7d0e243afad70f9dc74f3348b5252a4c2aea455a6b0bdc7f40c04
7
- data.tar.gz: e6b3723b6b3de1b558797c2334252369896674c451f40760ff0a1f8ccde01c14a55058c30f4fc1a7d117c70406a1e67880ecaf5cf597270358033d3e88c96d01
6
+ metadata.gz: dae28edc37bb45b1852a9d1f60347e74496d2ba371645514654ae9807a680de40d5487779b219a0fef3cad4ce220b2f0444e51c9907dbd6269653d2082eff1bf
7
+ data.tar.gz: 32e6df91034dd5423d8c3787512246e570a1cec2d5d85bdfee2eed2d1932640562dc9ef08881aa6fe09edb1d218597613833ac56389f3807327a28cef7e517db
data/README.md CHANGED
@@ -6,11 +6,11 @@ Rails' polymorphic associations are pretty useful. The example they give to set
6
6
  class Picture < ActiveRecord::Base
7
7
  belongs_to :imageable, polymorphic: true
8
8
  end
9
-
9
+
10
10
  class Employee < ActiveRecord::Base
11
11
  has_many :pictures, as: :imageable
12
12
  end
13
-
13
+
14
14
  class Product < ActiveRecord::Base
15
15
  has_many :pictures, as: :imageable
16
16
  end
@@ -31,7 +31,7 @@ class CreatePictures < ActiveRecord::Migration
31
31
  end
32
32
  ```
33
33
 
34
- The problem with this approach is that `imageable_type` is a string (and by default it is 255 characters). This is a little ridiculous. For comparison, if we had a state machine with X states, would we describe the states with strings `"State1", "State2", etc` or would we just enumerate the state column and make it an integer? This gem will allow us to use an integer for the `imageable_type` column.
34
+ The problem with this approach is that `imageable_type` is a string (and by default it is 255 characters). This is a little ridiculous. For comparison, if we had a state machine with X states, would we describe the states with strings `"State1", "State2", etc` or would we just enumerate the state column and make it an integer? This gem will allow us to use an integer for the `imageable_type` column.
35
35
 
36
36
  ## Installation
37
37
 
@@ -47,8 +47,6 @@ Or install it yourself as:
47
47
 
48
48
  $ gem install polymorphic_integer_type
49
49
 
50
- For Rails 3.2 use version < 2. Version >= 2 has been tested on Rails 4.2 and Ruby 2.1
51
-
52
50
  ## Usage
53
51
 
54
52
  For the model where the `belongs_to` is defined, include `PolymorphicIntegerType::Extensions` and set the `polymorphic:` option to a hash that maps an integer stored in the database to the name of a Ruby class.
@@ -60,7 +58,7 @@ class Picture < ActiveRecord::Base
60
58
  belongs_to :imageable, polymorphic: {1 => "Employee", 2 => "Product"}
61
59
  end
62
60
  ```
63
-
61
+
64
62
  Next, include `PolymorphicIntegerType::Extensions` into any of the models that point back to the polymorphic integer type association (e.g., `Picture#imageable`) and add a [polymorphic association using `as:`](http://guides.rubyonrails.org/association_basics.html#polymorphic-associations).
65
63
 
66
64
  ```ruby
@@ -69,7 +67,7 @@ class Employee < ActiveRecord::Base
69
67
 
70
68
  has_many :pictures, as: :imageable
71
69
  end
72
-
70
+
73
71
  class Product < ActiveRecord::Base
74
72
  include PolymorphicIntegerType::Extensions
75
73
 
@@ -84,10 +82,10 @@ You can also store polymorphic type mappings separate from your models. This sho
84
82
  ```ruby
85
83
  PolymorphicIntegerType::Mapping.configuration do |config|
86
84
  config.add :imageable, {1 => "Employee", 2 => "Product" }
87
- end
85
+ end
88
86
  ```
89
87
 
90
- Note: The mapping here can start from whatever integer you wish, but I would advise not using 0. The reason being that if you had a new class, for instance `Avatar`, and also wanted to use this polymorphic association but forgot to include it in the mapping, it would effectively get `to_i` called on it and stored in the database. `"Avatar".to_i == 0`, so if your mapping included 0, this would create a weird bug.
88
+ Note: The mapping here can start from whatever integer you wish, but I would advise not using 0. The reason being that if you had a new class, for instance `Avatar`, and also wanted to use this polymorphic association but forgot to include it in the mapping, it would effectively get `to_i` called on it and stored in the database. `"Avatar".to_i == 0`, so if your mapping included 0, this would create a weird bug.
91
89
 
92
90
  ### Migrating an existing association
93
91
 
@@ -95,14 +93,14 @@ If you want to convert a polymorphic association that is already a string, you'l
95
93
 
96
94
  ```ruby
97
95
  class PictureToPolymorphicIntegerType < ActiveRecord::Migration
98
-
96
+
99
97
  def up
100
98
  change_table :pictures do |t|
101
99
  t.integer :new_imageable_type
102
100
  end
103
101
 
104
102
  execute <<-SQL
105
- UPDATE reminders
103
+ UPDATE picture
106
104
  SET new_imageable_type = CASE imageable_type
107
105
  WHEN 'Employee' THEN 1
108
106
  WHEN 'Product' THEN 2
data/Rakefile CHANGED
@@ -2,6 +2,17 @@ require "bundler/gem_tasks"
2
2
  require "yaml"
3
3
  require "active_record"
4
4
 
5
+ namespace :test do
6
+ task :all do
7
+ Dir.glob("./gemfiles/Gemfile*").each do |gemfile|
8
+ next if gemfile.end_with?(".lock")
9
+ puts "Running specs for #{Pathname.new(gemfile).basename}"
10
+ system("BUNDLE_GEMFILE=#{gemfile} bundle install > /dev/null && BUNDLE_GEMFILE=#{gemfile} bundle exec rspec")
11
+ puts ""
12
+ end
13
+ end
14
+ end
15
+
5
16
  namespace :db do
6
17
  database_config = YAML.load(File.open("./spec/support/database.yml"))
7
18
  admin_database_config = database_config.merge(database: "mysql")
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: ".."
6
+
7
+ gem "activerecord", github: "rails/rails", branch: "5-0-stable"
8
+ gem "sqlite3", "~> 1.3.6"
@@ -0,0 +1,74 @@
1
+ GIT
2
+ remote: https://github.com/rails/rails.git
3
+ revision: ac6aa32f7cf66264ba87eabed7c042bb60bcf3a2
4
+ branch: 5-0-stable
5
+ specs:
6
+ activemodel (5.0.7.2)
7
+ activesupport (= 5.0.7.2)
8
+ activerecord (5.0.7.2)
9
+ activemodel (= 5.0.7.2)
10
+ activesupport (= 5.0.7.2)
11
+ arel (~> 7.0)
12
+ activesupport (5.0.7.2)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 0.7, < 2)
15
+ minitest (~> 5.1)
16
+ tzinfo (~> 1.1)
17
+
18
+ PATH
19
+ remote: ..
20
+ specs:
21
+ polymorphic_integer_type (3.0.0)
22
+ activerecord (< 6.1)
23
+
24
+ GEM
25
+ remote: https://rubygems.org/
26
+ specs:
27
+ arel (7.1.4)
28
+ byebug (11.1.3)
29
+ coderay (1.1.3)
30
+ concurrent-ruby (1.1.8)
31
+ diff-lcs (1.4.4)
32
+ i18n (1.8.10)
33
+ concurrent-ruby (~> 1.0)
34
+ method_source (1.0.0)
35
+ minitest (5.14.4)
36
+ pry (0.13.1)
37
+ coderay (~> 1.1)
38
+ method_source (~> 1.0)
39
+ pry-byebug (3.9.0)
40
+ byebug (~> 11.0)
41
+ pry (~> 0.13.0)
42
+ rake (13.0.3)
43
+ rspec (3.10.0)
44
+ rspec-core (~> 3.10.0)
45
+ rspec-expectations (~> 3.10.0)
46
+ rspec-mocks (~> 3.10.0)
47
+ rspec-core (3.10.1)
48
+ rspec-support (~> 3.10.0)
49
+ rspec-expectations (3.10.1)
50
+ diff-lcs (>= 1.2.0, < 2.0)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-mocks (3.10.2)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.10.0)
55
+ rspec-support (3.10.2)
56
+ sqlite3 (1.3.13)
57
+ thread_safe (0.3.6)
58
+ tzinfo (1.2.9)
59
+ thread_safe (~> 0.1)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ activerecord!
66
+ bundler
67
+ polymorphic_integer_type!
68
+ pry-byebug
69
+ rake
70
+ rspec
71
+ sqlite3 (~> 1.3.6)
72
+
73
+ BUNDLED WITH
74
+ 2.1.4
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: ".."
6
+
7
+ gem "activerecord", github: "rails/rails", branch: "5-1-stable"
@@ -0,0 +1,74 @@
1
+ GIT
2
+ remote: https://github.com/rails/rails.git
3
+ revision: 663206d20aec374a28a24bb43bc7b1233042ed9b
4
+ branch: 5-1-stable
5
+ specs:
6
+ activemodel (5.1.7)
7
+ activesupport (= 5.1.7)
8
+ activerecord (5.1.7)
9
+ activemodel (= 5.1.7)
10
+ activesupport (= 5.1.7)
11
+ arel (~> 8.0)
12
+ activesupport (5.1.7)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 0.7, < 2)
15
+ minitest (~> 5.1)
16
+ tzinfo (~> 1.1)
17
+
18
+ PATH
19
+ remote: ..
20
+ specs:
21
+ polymorphic_integer_type (3.0.0)
22
+ activerecord (< 6.1)
23
+
24
+ GEM
25
+ remote: https://rubygems.org/
26
+ specs:
27
+ arel (8.0.0)
28
+ byebug (11.1.3)
29
+ coderay (1.1.3)
30
+ concurrent-ruby (1.1.8)
31
+ diff-lcs (1.4.4)
32
+ i18n (1.8.10)
33
+ concurrent-ruby (~> 1.0)
34
+ method_source (1.0.0)
35
+ minitest (5.14.4)
36
+ pry (0.13.1)
37
+ coderay (~> 1.1)
38
+ method_source (~> 1.0)
39
+ pry-byebug (3.9.0)
40
+ byebug (~> 11.0)
41
+ pry (~> 0.13.0)
42
+ rake (13.0.3)
43
+ rspec (3.10.0)
44
+ rspec-core (~> 3.10.0)
45
+ rspec-expectations (~> 3.10.0)
46
+ rspec-mocks (~> 3.10.0)
47
+ rspec-core (3.10.1)
48
+ rspec-support (~> 3.10.0)
49
+ rspec-expectations (3.10.1)
50
+ diff-lcs (>= 1.2.0, < 2.0)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-mocks (3.10.2)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.10.0)
55
+ rspec-support (3.10.2)
56
+ sqlite3 (1.4.2)
57
+ thread_safe (0.3.6)
58
+ tzinfo (1.2.9)
59
+ thread_safe (~> 0.1)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ activerecord!
66
+ bundler
67
+ polymorphic_integer_type!
68
+ pry-byebug
69
+ rake
70
+ rspec
71
+ sqlite3
72
+
73
+ BUNDLED WITH
74
+ 2.1.4
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: ".."
6
+
7
+ gem "activerecord", github: "rails/rails", branch: "5-2-stable"
@@ -0,0 +1,74 @@
1
+ GIT
2
+ remote: https://github.com/rails/rails.git
3
+ revision: 48661542a2607d55f436438fe21001d262e61fec
4
+ branch: 5-2-stable
5
+ specs:
6
+ activemodel (5.2.6)
7
+ activesupport (= 5.2.6)
8
+ activerecord (5.2.6)
9
+ activemodel (= 5.2.6)
10
+ activesupport (= 5.2.6)
11
+ arel (>= 9.0)
12
+ activesupport (5.2.6)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 0.7, < 2)
15
+ minitest (~> 5.1)
16
+ tzinfo (~> 1.1)
17
+
18
+ PATH
19
+ remote: ..
20
+ specs:
21
+ polymorphic_integer_type (3.0.0)
22
+ activerecord (< 6.1)
23
+
24
+ GEM
25
+ remote: https://rubygems.org/
26
+ specs:
27
+ arel (9.0.0)
28
+ byebug (11.1.3)
29
+ coderay (1.1.3)
30
+ concurrent-ruby (1.1.8)
31
+ diff-lcs (1.4.4)
32
+ i18n (1.8.10)
33
+ concurrent-ruby (~> 1.0)
34
+ method_source (1.0.0)
35
+ minitest (5.14.4)
36
+ pry (0.13.1)
37
+ coderay (~> 1.1)
38
+ method_source (~> 1.0)
39
+ pry-byebug (3.9.0)
40
+ byebug (~> 11.0)
41
+ pry (~> 0.13.0)
42
+ rake (13.0.3)
43
+ rspec (3.10.0)
44
+ rspec-core (~> 3.10.0)
45
+ rspec-expectations (~> 3.10.0)
46
+ rspec-mocks (~> 3.10.0)
47
+ rspec-core (3.10.1)
48
+ rspec-support (~> 3.10.0)
49
+ rspec-expectations (3.10.1)
50
+ diff-lcs (>= 1.2.0, < 2.0)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-mocks (3.10.2)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.10.0)
55
+ rspec-support (3.10.2)
56
+ sqlite3 (1.4.2)
57
+ thread_safe (0.3.6)
58
+ tzinfo (1.2.9)
59
+ thread_safe (~> 0.1)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ activerecord!
66
+ bundler
67
+ polymorphic_integer_type!
68
+ pry-byebug
69
+ rake
70
+ rspec
71
+ sqlite3
72
+
73
+ BUNDLED WITH
74
+ 2.1.4
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: ".."
6
+
7
+ gem "activerecord", github: "rails/rails", branch: "6-0-stable"
@@ -0,0 +1,74 @@
1
+ GIT
2
+ remote: https://github.com/rails/rails.git
3
+ revision: ef97441036e0ebbe1aa2108d59c408707f998ffd
4
+ branch: 6-0-stable
5
+ specs:
6
+ activemodel (6.0.3.7)
7
+ activesupport (= 6.0.3.7)
8
+ activerecord (6.0.3.7)
9
+ activemodel (= 6.0.3.7)
10
+ activesupport (= 6.0.3.7)
11
+ activesupport (6.0.3.7)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
17
+
18
+ PATH
19
+ remote: ..
20
+ specs:
21
+ polymorphic_integer_type (3.0.0)
22
+ activerecord (< 6.1)
23
+
24
+ GEM
25
+ remote: https://rubygems.org/
26
+ specs:
27
+ byebug (11.1.3)
28
+ coderay (1.1.3)
29
+ concurrent-ruby (1.1.8)
30
+ diff-lcs (1.4.4)
31
+ i18n (1.8.10)
32
+ concurrent-ruby (~> 1.0)
33
+ method_source (1.0.0)
34
+ minitest (5.14.4)
35
+ pry (0.13.1)
36
+ coderay (~> 1.1)
37
+ method_source (~> 1.0)
38
+ pry-byebug (3.9.0)
39
+ byebug (~> 11.0)
40
+ pry (~> 0.13.0)
41
+ rake (13.0.3)
42
+ rspec (3.10.0)
43
+ rspec-core (~> 3.10.0)
44
+ rspec-expectations (~> 3.10.0)
45
+ rspec-mocks (~> 3.10.0)
46
+ rspec-core (3.10.1)
47
+ rspec-support (~> 3.10.0)
48
+ rspec-expectations (3.10.1)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.10.0)
51
+ rspec-mocks (3.10.2)
52
+ diff-lcs (>= 1.2.0, < 2.0)
53
+ rspec-support (~> 3.10.0)
54
+ rspec-support (3.10.2)
55
+ sqlite3 (1.4.2)
56
+ thread_safe (0.3.6)
57
+ tzinfo (1.2.9)
58
+ thread_safe (~> 0.1)
59
+ zeitwerk (2.4.2)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ activerecord!
66
+ bundler
67
+ polymorphic_integer_type!
68
+ pry-byebug
69
+ rake
70
+ rspec
71
+ sqlite3
72
+
73
+ BUNDLED WITH
74
+ 2.1.4
@@ -1,10 +1,14 @@
1
+ ACTIVE_RECORD_VERSION = Gem::Version.new(ActiveRecord::VERSION::STRING)
2
+
1
3
  require "polymorphic_integer_type/version"
2
4
  require "polymorphic_integer_type/extensions"
3
5
  require "polymorphic_integer_type/mapping"
4
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new("5")
5
- require "polymorphic_integer_type/predicate_builder_extension"
6
- else
7
- require "polymorphic_integer_type/polymorphic_array_value_extension"
6
+ require "polymorphic_integer_type/module_generator"
7
+ require "polymorphic_integer_type/belongs_to_polymorphic_association_extension"
8
+ require "polymorphic_integer_type/activerecord_5_0_0/polymorphic_array_value_extension"
9
+
10
+ if ACTIVE_RECORD_VERSION < Gem::Version.new("5.2.0")
11
+ require "polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension"
8
12
  end
9
13
 
10
14
  module PolymorphicIntegerType; end
@@ -0,0 +1,38 @@
1
+ module PolymorphicIntegerType
2
+ module AssociationQueryHandlerExtension
3
+ def call(attribute, value)
4
+ queries = {}
5
+ table = value.associated_table
6
+
7
+ if value.base_class
8
+ queries[table.association_foreign_type.to_s] = polymorphic_value_for(value)
9
+ end
10
+
11
+ queries[table.association_foreign_key.to_s] = value.ids
12
+ predicate_builder.build_from_hash(queries)
13
+ end
14
+
15
+ protected
16
+
17
+ def polymorphic_value_for(query_value)
18
+ table = query_value.associated_table
19
+ association = table.send(:association)
20
+ klass = association.active_record
21
+ name = association.name
22
+
23
+ if klass.respond_to?("#{name}_type_mapping")
24
+ type_mapping = klass.send("#{name}_type_mapping")
25
+
26
+ type_mapping.key(query_value.value.class.sti_name) ||
27
+ type_mapping.key(query_value.base_class.to_s) ||
28
+ type_mapping.key(query_value.base_class.sti_name)
29
+ else
30
+ query_value.base_class.name
31
+ end
32
+ end
33
+
34
+
35
+ end
36
+ end
37
+
38
+ ActiveRecord::PredicateBuilder::AssociationQueryHandler.prepend(PolymorphicIntegerType::AssociationQueryHandlerExtension)
@@ -0,0 +1,34 @@
1
+ module PolymorphicIntegerType
2
+ module PolymorphicArrayValueExtension
3
+
4
+ # original method:
5
+ # def type_to_ids_mapping
6
+ # default_hash = Hash.new { |hsh, key| hsh[key] = [] }
7
+ # result = values.each_with_object(default_hash) do |value, hash|
8
+ # hash[klass(value).polymorphic_name] << convert_to_id(value)
9
+ # end
10
+ # end
11
+
12
+ def type_to_ids_mapping
13
+ association = @associated_table.send(:association)
14
+ name = association.name
15
+ default_hash = Hash.new { |hsh, key| hsh[key] = [] }
16
+ values.each_with_object(default_hash) do |value, hash|
17
+ klass = respond_to?(:klass, true) ? klass(value) : value.class
18
+ if association.active_record.respond_to?("#{name}_type_mapping")
19
+ mapping = association.active_record.send("#{name}_type_mapping")
20
+ key ||= mapping.key(klass.polymorphic_name) if klass.respond_to?(:polymorphic_name)
21
+ key ||= mapping.key(klass.sti_name)
22
+ key ||= mapping.key(klass.base_class.to_s)
23
+ key ||= mapping.key(klass.base_class.sti_name)
24
+
25
+ hash[key] << convert_to_id(value)
26
+ else
27
+ hash[klass.polymorphic_name] << convert_to_id(value)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ ActiveRecord::PredicateBuilder::PolymorphicArrayValue.prepend(PolymorphicIntegerType::PolymorphicArrayValueExtension)
@@ -0,0 +1,12 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ class BelongsToPolymorphicAssociation < BelongsToAssociation
4
+ private def replace_keys(record)
5
+ super
6
+ unless record.nil?
7
+ owner[reflection.foreign_type] = record.class.base_class
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -20,35 +20,11 @@ module PolymorphicIntegerType
20
20
  _polymorphic_foreign_types << foreign_type
21
21
 
22
22
  # Required way to dynamically define a class method on the model
23
- singleton_class.__send__(:define_method, "#{foreign_type}_mapping") do
23
+ define_singleton_method("#{foreign_type}_mapping") do
24
24
  mapping
25
25
  end
26
26
 
27
- foreign_type_extension = Module.new do
28
- define_method foreign_type do
29
- t = super()
30
- self.class.send("#{foreign_type}_mapping")[t]
31
- end
32
-
33
- define_method "#{foreign_type}=" do |klass|
34
- mapping = self.class.send("#{foreign_type}_mapping")
35
- enum = mapping.key(klass.to_s)
36
- if klass.kind_of?(Class) && klass <= ActiveRecord::Base
37
- enum ||= mapping.key(klass.sti_name)
38
- enum ||= mapping.key(klass.base_class.to_s)
39
- enum ||= mapping.key(klass.base_class.sti_name)
40
- end
41
- enum ||= klass if klass != NilClass
42
- super(enum)
43
- end
44
-
45
- define_method "#{name}=" do |record|
46
- super(record)
47
- send("#{foreign_type}=", record.class)
48
- end
49
- end
50
-
51
- include(foreign_type_extension)
27
+ ModuleGenerator.generate_and_include(self, foreign_type, name)
52
28
 
53
29
  validate do
54
30
  t = send(foreign_type)
@@ -69,14 +45,15 @@ module PolymorphicIntegerType
69
45
  if options[:as] && (polymorphic_type_mapping || integer_type)
70
46
  poly_type = options.delete(:as)
71
47
  polymorphic_type_mapping ||= PolymorphicIntegerType::Mapping[poly_type]
72
- if polymorphic_type_mapping == nil
48
+ if polymorphic_type_mapping.nil?
73
49
  raise "Polymorphic type mapping missing for #{poly_type.inspect}"
74
50
  end
75
51
 
76
- klass_mapping = (polymorphic_type_mapping || {}).key(sti_name)
52
+ klass_mapping = polymorphic_type_mapping.key(polymorphic_name) if respond_to?(:polymorphic_name)
53
+ klass_mapping ||= polymorphic_type_mapping.key(sti_name)
77
54
 
78
- if klass_mapping == nil
79
- raise "Class not found for #{sti_name.inspect} in polymorphic type mapping: #{polymorphic_type_mapping}"
55
+ if klass_mapping.nil?
56
+ raise "Class not found for #{inspect} in polymorphic type mapping: #{polymorphic_type_mapping}"
80
57
  end
81
58
 
82
59
  options[:foreign_key] ||= "#{poly_type}_id"
@@ -95,7 +72,7 @@ module PolymorphicIntegerType
95
72
  def retrieve_polymorphic_type_mapping(polymorphic_type:, class_name:)
96
73
  return if polymorphic_type.nil?
97
74
 
98
- belongs_to_class = class_name.safe_constantize
75
+ belongs_to_class = compute_type(class_name)
99
76
  method_name = "#{polymorphic_type}_type_mapping"
100
77
 
101
78
  if belongs_to_class && belongs_to_class.respond_to?(method_name)
@@ -15,6 +15,6 @@ module PolymorphicIntegerType
15
15
  @@mapping[as] || {}
16
16
  end
17
17
 
18
+ singleton_class.send(:alias_method, :[]=, :add)
18
19
  end
19
-
20
20
  end
@@ -0,0 +1,34 @@
1
+ module PolymorphicIntegerType
2
+ class ModuleGenerator
3
+ def self.generate_and_include(klass,foreign_type, name)
4
+ foreign_type_extension = Module.new do
5
+ define_method foreign_type do
6
+ t = super()
7
+ self.class.send("#{foreign_type}_mapping")[t]
8
+ end
9
+
10
+ define_method "#{foreign_type}=" do |klass|
11
+ mapping = self.class.send("#{foreign_type}_mapping")
12
+ enum = mapping.key(klass.to_s)
13
+ if klass.kind_of?(Class) && klass <= ActiveRecord::Base
14
+ enum ||= mapping.key(klass.polymorphic_name) if klass.respond_to?(:polymorphic_name)
15
+ enum ||= mapping.key(klass.sti_name)
16
+ enum ||= mapping.key(klass.base_class.to_s)
17
+ enum ||= mapping.key(klass.base_class.sti_name)
18
+ end
19
+ enum ||= klass if klass != NilClass
20
+ super(enum)
21
+ end
22
+
23
+ define_method "#{name}=" do |record|
24
+ super(record)
25
+ send("#{foreign_type}=", record.class)
26
+ association(name).loaded!
27
+ end
28
+ end
29
+
30
+ klass.include(foreign_type_extension)
31
+ end
32
+ end
33
+ end
34
+
@@ -1,3 +1,3 @@
1
1
  module PolymorphicIntegerType
2
- VERSION = "2.2.3"
2
+ VERSION = "3.0.0"
3
3
  end
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "activerecord"
21
+ spec.add_dependency "activerecord", "< 6.1"
22
22
  spec.add_development_dependency "bundler"
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rspec"
25
25
  spec.add_development_dependency "sqlite3"
26
- spec.add_development_dependency "byebug"
26
+ spec.add_development_dependency "pry-byebug"
27
27
  end
@@ -14,6 +14,50 @@ describe PolymorphicIntegerType do
14
14
 
15
15
  let(:link) { Link.create(source: source, target: target) }
16
16
 
17
+
18
+ context "when creating associations" do
19
+ it "sets the source_type" do
20
+ link = dog.source_links.new
21
+ expect(link.source_type).to eq("Animal")
22
+ end
23
+
24
+ it "sets the target_type" do
25
+ link = kibble.target_links.new
26
+ expect(link.target_type).to eq("Food")
27
+ end
28
+
29
+ context "when models are namespaced" do
30
+ context "and mappings include namespaces" do
31
+ it "sets the source_type" do
32
+ allow(Link).to receive(:source_type_mapping).and_return({3 => "Namespaced::Plant"})
33
+ allow(Link).to receive(:source_type_mapping2).and_return({3 => "Namespaced::Plant"})
34
+
35
+ link = Namespaced::Plant.create(name: "Oak").source_links.new
36
+ expect(link.source_type).to eq("Namespaced::Plant")
37
+ end
38
+
39
+ it "sets the target_type" do
40
+ allow(Link).to receive(:target_type_mapping).and_return({3 => "Namespaced::Activity"})
41
+ link = Namespaced::Activity.create(name: "swaying").target_links.new
42
+ expect(link.target_type).to eq("Namespaced::Activity")
43
+ end
44
+ end
45
+
46
+ context "and mappings don't include namespaces" do
47
+ it "sets the source type" do
48
+ Link.source_type_mapping
49
+ link = Namespaced::Plant.create(name: "Oak").source_links.new
50
+ expect(link.source_type).to eq("Plant")
51
+ end
52
+
53
+ it "sets the target type" do
54
+ link = Namespaced::Activity.create(name:"swaying").target_links.new
55
+ expect(link.target_type).to eq("Activity")
56
+ end
57
+ end
58
+ end
59
+ end
60
+
17
61
  context "when the source is nil" do
18
62
  let(:source) { nil }
19
63
  let(:target) { nil }
@@ -24,22 +68,64 @@ describe PolymorphicIntegerType do
24
68
  end
25
69
  end
26
70
 
27
- context "when the source is a class that modifies the sti_name" do
71
+ context "when the source is a class that modifies the sti_name or polymorphic_name" do
72
+ context "and we leverage the polymorphic_name" do
73
+ before do
74
+ allow(PolymorphicIntegerType).to receive(:use_polymorphic_name).and_return(true)
75
+ end
76
+
77
+ it "properly sets the source_type to the modified class name" do
78
+ link = Link.new(source: Namespaced::Animal.new)
79
+ expect(link.source_type).to eql "Animal"
80
+ end
81
+
82
+ it "can read dirty attributes from an associated object" do
83
+ animal = Namespaced::Animal.create!(name: "Oldie")
84
+ animal.name = "Newton"
85
+ link = Link.create!(source: animal)
86
+
87
+ expect(link.source.name).to eq("Newton")
88
+ end
89
+ end
90
+
28
91
  it "properly sets the source_type to the modified class name" do
29
92
  link = Link.new(source: Namespaced::Animal.new)
30
93
  expect(link.source_type).to eql "Animal"
31
94
  end
95
+
96
+ it "can read dirty attributes from an associated object" do
97
+ animal = Namespaced::Animal.create!(name: "Oldie")
98
+ animal.name = "Newton"
99
+ link = Link.create!(source: animal)
100
+
101
+ expect(link.source.name).to eq("Newton")
102
+ end
32
103
  end
33
104
 
34
105
  context "when querying the associations" do
35
106
  let(:source) { cat }
36
107
  let(:target) { nil }
108
+
37
109
  it "properly finds the object with a where" do
38
110
  expect(Link.where(source: source, id: link.id).first).to eql link
39
111
  end
112
+
113
+ it "properly finds the object when passing an array of sources" do
114
+ expect(Link.where(source: [source])).to eq [link]
115
+ end
116
+
40
117
  it "properly finds the object with a find_by" do
41
118
  expect(Link.find_by(source: source, id: link.id)).to eql link
42
119
  end
120
+
121
+ context "when source and target are namespaced without modifying polymorphic_name" do
122
+ it "properly finds the object" do
123
+ plant = Namespaced::Plant.create(name: "Mighty", kind: "Oak", owner: owner)
124
+ activity = Namespaced::Activity.create(name: "swaying")
125
+ link = Link.create(source: plant, target: activity)
126
+ expect(Link.where(source: plant, id: link.id).first).to eql link
127
+ end
128
+ end
43
129
  end
44
130
 
45
131
  shared_examples "proper source" do
@@ -70,7 +156,6 @@ describe PolymorphicIntegerType do
70
156
  expect(source.source_links[0].source).to eql source
71
157
  end
72
158
  end
73
-
74
159
  end
75
160
  context "When a link is given polymorphic record" do
76
161
  let(:link) { Link.create(source: source) }
@@ -79,13 +164,11 @@ describe PolymorphicIntegerType do
79
164
 
80
165
  context "and when it already has a polymorphic record" do
81
166
  let(:target) { kibble }
82
- before { link.update_attributes(target: target) }
167
+ before { link.update(target: target) }
83
168
 
84
169
  include_examples "proper source"
85
170
  include_examples "proper target"
86
-
87
171
  end
88
-
89
172
  end
90
173
 
91
174
  context "When a link is given polymorphic id and type" do
@@ -95,15 +178,13 @@ describe PolymorphicIntegerType do
95
178
 
96
179
  context "and when it already has a polymorphic id and type" do
97
180
  let(:target) { kibble }
98
- before { link.update_attributes(target_id: target.id, target_type: target.class.to_s) }
181
+ before { link.update(target_id: target.id, target_type: target.class.to_s) }
99
182
  include_examples "proper source"
100
183
  include_examples "proper target"
101
-
102
184
  end
103
-
104
185
  end
105
186
 
106
- context "When using a relation to the links with eagar loading" do
187
+ context "When using a relation to the links with eager loading" do
107
188
  let!(:links){
108
189
  [Link.create(source: source, target: kibble),
109
190
  Link.create(source: source, target: water)]
@@ -113,12 +194,10 @@ describe PolymorphicIntegerType do
113
194
  it "should be able to return the links and the targets" do
114
195
  expect(cat.source_links).to match_array links
115
196
  expect(cat.source_links.includes(:target).collect(&:target)).to match_array [water, kibble]
116
-
117
197
  end
118
-
119
198
  end
120
199
 
121
- context "When using a through relation to the links with eagar loading" do
200
+ context "When using a through relation to the links with eager loading" do
122
201
  let!(:links){
123
202
  [Link.create(source: source, target: kibble),
124
203
  Link.create(source: source, target: water)]
@@ -128,12 +207,10 @@ describe PolymorphicIntegerType do
128
207
  it "should be able to return the links and the targets" do
129
208
  expect(owner.pet_source_links).to match_array links
130
209
  expect(owner.pet_source_links.includes(:target).collect(&:target)).to match_array [water, kibble]
131
-
132
210
  end
133
-
134
211
  end
135
212
 
136
- context "When eagar loading the polymorphic association" do
213
+ context "When eager loading the polymorphic association" do
137
214
  let(:link) { Link.create(source_id: source.id, source_type: source.class.to_s) }
138
215
  let(:source) { cat }
139
216
 
@@ -145,15 +222,12 @@ describe PolymorphicIntegerType do
145
222
  expect(links.first.source).to eql cat
146
223
  expect(links.last.source).to eql dog
147
224
  end
148
-
149
225
  end
150
226
 
151
227
  it "should be able to preload the association" do
152
228
  l = Link.includes(:source).where(id: link.id).first
153
229
  expect(l.source).to eql cat
154
230
  end
155
-
156
-
157
231
  end
158
232
 
159
233
  context "when the association is an STI table" do
@@ -205,7 +279,7 @@ describe PolymorphicIntegerType do
205
279
  include_examples "proper target"
206
280
 
207
281
  it "creates foreign_type mapping method" do
208
- expect(Link.source_type_mapping).to eq({1 => "Person", 2 => "Animal"})
282
+ expect(Link.source_type_mapping).to eq({1 => "Person", 2 => "Animal", 3 => "Plant"})
209
283
  expect(InlineLink.source_type_mapping).to eq({10 => "Person", 11 => "InlineAnimal"})
210
284
  end
211
285
 
@@ -246,7 +320,7 @@ describe PolymorphicIntegerType do
246
320
 
247
321
  self.table_name = "drinks"
248
322
 
249
- has_many :inline_links2, as: :target
323
+ has_many :inline_link2s, as: :target
250
324
  end
251
325
 
252
326
  let!(:animal) { InlineAnimal2.create!(name: "Lucy") }
data/spec/spec_helper.rb CHANGED
@@ -5,17 +5,26 @@ require 'support/configuration'
5
5
  require 'support/link'
6
6
  require 'support/animal'
7
7
  require 'support/namespaced_animal'
8
+ require 'support/namespaced_plant'
8
9
  require 'support/dog'
9
10
  require 'support/person'
10
11
  require 'support/food'
11
12
  require 'support/drink'
13
+ require 'support/namespaced_activity'
14
+ require 'byebug'
15
+ require 'pry'
12
16
 
13
17
  RSpec.configure do |config|
14
18
  config.before(:suite) do
15
19
  database_config = YAML.load(File.open("#{File.dirname(__FILE__)}/support/database.yml"))
16
20
  ActiveRecord::Base.establish_connection(database_config)
17
- if Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new("5")
18
- ActiveRecord::MigrationContext.new("#{File.dirname(__FILE__)}/support/migrations").migrate
21
+
22
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) == Gem::Version.new("5.2.0")
23
+ ActiveRecord::MigrationContext.new("#{File.dirname(__FILE__)}/support/migrations").migrate
24
+ end
25
+
26
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new("6.0")
27
+ ActiveRecord::MigrationContext.new("#{File.dirname(__FILE__)}/support/migrations", ActiveRecord::SchemaMigration).migrate
19
28
  end
20
29
  end
21
30
 
@@ -1,4 +1,4 @@
1
1
  PolymorphicIntegerType::Mapping.configuration do |config|
2
- config.add :source, {1 => "Person", 2 => "Animal"}
3
- config.add :target, {1 => "Food", 2 => "Drink"}
2
+ config.add :source, {1 => "Person", 2 => "Animal", 3 => "Plant"}
3
+ config.add :target, {1 => "Food", 2 => "Drink", 3 => "Activity"}
4
4
  end
data/spec/support/link.rb CHANGED
@@ -3,12 +3,4 @@ class Link < ActiveRecord::Base
3
3
 
4
4
  belongs_to :source, polymorphic: true, integer_type: true
5
5
  belongs_to :target, polymorphic: true, integer_type: true
6
-
7
- def source=(val)
8
- super(val)
9
- end
10
-
11
- def source_type=(val)
12
- super(val)
13
- end
14
6
  end
@@ -0,0 +1,17 @@
1
+ class CreatePlantTable < ActiveRecord::Migration[5.2]
2
+
3
+ def up
4
+ create_table :plants do |t|
5
+ t.string :name
6
+ t.string :type
7
+ t.string :kind
8
+ t.integer :owner_id
9
+ end
10
+ end
11
+
12
+ def down
13
+ drop_table :plants
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,15 @@
1
+ class CreateActivityTable < ActiveRecord::Migration[5.2]
2
+
3
+ def up
4
+ create_table :activities do |t|
5
+ t.string :name
6
+ end
7
+ end
8
+
9
+ def down
10
+ drop_table :activities
11
+ end
12
+
13
+ end
14
+
15
+
@@ -0,0 +1,11 @@
1
+ module Namespaced
2
+ class Activity < ActiveRecord::Base
3
+ include PolymorphicIntegerType::Extensions
4
+
5
+ self.store_full_sti_class = false
6
+ self.table_name = "activities"
7
+
8
+ has_many :target_links, as: :target, inverse_of: :target, integer_type: true, class_name: "Link"
9
+ end
10
+ end
11
+
@@ -3,5 +3,9 @@ module Namespaced
3
3
 
4
4
  self.store_full_sti_class = false
5
5
  self.table_name = "animals"
6
+
7
+ def self.polymorphic_name
8
+ "Animal"
9
+ end
6
10
  end
7
- end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Namespaced
2
+ class Plant < ActiveRecord::Base
3
+ include PolymorphicIntegerType::Extensions
4
+
5
+ self.store_full_sti_class = false
6
+ self.table_name = "plants"
7
+
8
+ belongs_to :owner, class_name: "Person"
9
+ has_many :source_links, as: :source, inverse_of: :source, integer_type: true, class_name: "Link"
10
+ end
11
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polymorphic_integer_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle d'Oliveira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-09 00:00:00.000000000 Z
11
+ date: 2021-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "<"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '6.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "<"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '6.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: byebug
84
+ name: pry-byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -108,11 +108,21 @@ files:
108
108
  - README.md
109
109
  - Rakefile
110
110
  - bin/setup
111
+ - gemfiles/Gemfile.rails-5.0-stable
112
+ - gemfiles/Gemfile.rails-5.0-stable.lock
113
+ - gemfiles/Gemfile.rails-5.1-stable
114
+ - gemfiles/Gemfile.rails-5.1-stable.lock
115
+ - gemfiles/Gemfile.rails-5.2-stable
116
+ - gemfiles/Gemfile.rails-5.2-stable.lock
117
+ - gemfiles/Gemfile.rails-6-0-stable
118
+ - gemfiles/Gemfile.rails-6-0-stable.lock
111
119
  - lib/polymorphic_integer_type.rb
120
+ - lib/polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension.rb
121
+ - lib/polymorphic_integer_type/activerecord_5_0_0/polymorphic_array_value_extension.rb
122
+ - lib/polymorphic_integer_type/belongs_to_polymorphic_association_extension.rb
112
123
  - lib/polymorphic_integer_type/extensions.rb
113
124
  - lib/polymorphic_integer_type/mapping.rb
114
- - lib/polymorphic_integer_type/polymorphic_array_value_extension.rb
115
- - lib/polymorphic_integer_type/predicate_builder_extension.rb
125
+ - lib/polymorphic_integer_type/module_generator.rb
116
126
  - lib/polymorphic_integer_type/version.rb
117
127
  - polymorphic_integer_type.gemspec
118
128
  - spec/polymorphic_integer_type_spec.rb
@@ -129,13 +139,17 @@ files:
129
139
  - spec/support/migrations/3_create_person_table.rb
130
140
  - spec/support/migrations/4_create_food_table.rb
131
141
  - spec/support/migrations/5_create_drink_table.rb
142
+ - spec/support/migrations/6_create_plant_table.rb
143
+ - spec/support/migrations/7_create_activity_table.rb
144
+ - spec/support/namespaced_activity.rb
132
145
  - spec/support/namespaced_animal.rb
146
+ - spec/support/namespaced_plant.rb
133
147
  - spec/support/person.rb
134
148
  homepage: ''
135
149
  licenses:
136
150
  - MIT
137
151
  metadata: {}
138
- post_install_message:
152
+ post_install_message:
139
153
  rdoc_options: []
140
154
  require_paths:
141
155
  - lib
@@ -150,9 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
164
  - !ruby/object:Gem::Version
151
165
  version: '0'
152
166
  requirements: []
153
- rubyforge_project:
154
- rubygems_version: 2.6.14
155
- signing_key:
167
+ rubygems_version: 3.1.6
168
+ signing_key:
156
169
  specification_version: 4
157
170
  summary: Use integers rather than strings for the _type field
158
171
  test_files:
@@ -170,5 +183,9 @@ test_files:
170
183
  - spec/support/migrations/3_create_person_table.rb
171
184
  - spec/support/migrations/4_create_food_table.rb
172
185
  - spec/support/migrations/5_create_drink_table.rb
186
+ - spec/support/migrations/6_create_plant_table.rb
187
+ - spec/support/migrations/7_create_activity_table.rb
188
+ - spec/support/namespaced_activity.rb
173
189
  - spec/support/namespaced_animal.rb
190
+ - spec/support/namespaced_plant.rb
174
191
  - spec/support/person.rb
@@ -1,20 +0,0 @@
1
- module PolymorphicIntegerType
2
- module PolymorphicArrayValueExtension
3
- def type_to_ids_mapping
4
- super.tap do |result|
5
- association = @associated_table.send(:association)
6
- klass = association.active_record
7
- name = association.name
8
-
9
- if klass.respond_to?("#{name}_type_mapping")
10
- result.transform_keys! do |key|
11
- klass.send("#{name}_type_mapping").key(key)
12
- end
13
- end
14
- result
15
- end
16
- end
17
- end
18
- end
19
-
20
- ActiveRecord::PredicateBuilder::PolymorphicArrayValue.prepend(PolymorphicIntegerType::PolymorphicArrayValueExtension)
@@ -1,65 +0,0 @@
1
- module PolymorphicIntegerType
2
- module PredicateBuilderExtension
3
-
4
- # Original Code:
5
- # def self.expand(klass, table, column, value)
6
- # queries = []
7
-
8
- # # Find the foreign key when using queries such as:
9
- # # Post.where(author: author)
10
- # #
11
- # # For polymorphic relationships, find the foreign key and type:
12
- # # PriceEstimate.where(estimate_of: treasure)
13
- # if klass && reflection = klass._reflect_on_association(column)
14
- # base_class = polymorphic_base_class_from_value(value)
15
-
16
- # if reflection.polymorphic? && base_class
17
- # queries << build(table[reflection.foreign_type], base_class)
18
- # end
19
-
20
- # column = reflection.foreign_key
21
-
22
- # if base_class
23
- # primary_key = reflection.association_primary_key(base_class)
24
- # value = convert_value_to_association_ids(value, primary_key)
25
- # end
26
- # end
27
-
28
- # queries << build(table[column], value)
29
- # queries
30
- # end
31
-
32
- def expand(klass, table, column, value)
33
- queries = []
34
-
35
- # Find the foreign key when using queries such as:
36
- # Post.where(author: author)
37
- #
38
- # For polymorphic relationships, find the foreign key and type:
39
- # PriceEstimate.where(estimate_of: treasure)
40
- if klass && reflection = klass._reflect_on_association(column)
41
- base_class = polymorphic_base_class_from_value(value)
42
-
43
- if reflection.polymorphic? && base_class
44
- if klass.respond_to?("#{column}_type_mapping")
45
- queries << build(table[reflection.foreign_type], klass.send("#{column}_type_mapping").key(base_class.to_s))
46
- else
47
- queries << build(table[reflection.foreign_type], base_class)
48
- end
49
- end
50
-
51
- column = reflection.foreign_key
52
-
53
- if base_class
54
- primary_key = reflection.association_primary_key(base_class)
55
- value = convert_value_to_association_ids(value, primary_key)
56
- end
57
- end
58
-
59
- queries << build(table[column], value)
60
- queries
61
- end
62
- end
63
- end
64
-
65
- ActiveRecord::PredicateBuilder.singleton_class.prepend(PolymorphicIntegerType::PredicateBuilderExtension)