polymorphic_integer_type 2.2.5 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/workflows/ci.yml +34 -0
  4. data/.github/workflows/gem-push.yml +30 -0
  5. data/README.md +9 -11
  6. data/gemfiles/Gemfile.rails-6.0-stable +7 -0
  7. data/gemfiles/Gemfile.rails-6.1-stable +7 -0
  8. data/lib/polymorphic_integer_type/activerecord_5_0_0/polymorphic_array_value_extension.rb +27 -8
  9. data/lib/polymorphic_integer_type/belongs_to_polymorphic_association_extension.rb +19 -0
  10. data/lib/polymorphic_integer_type/extensions.rb +7 -30
  11. data/lib/polymorphic_integer_type/mapping.rb +1 -1
  12. data/lib/polymorphic_integer_type/module_generator.rb +34 -0
  13. data/lib/polymorphic_integer_type/version.rb +1 -1
  14. data/lib/polymorphic_integer_type.rb +4 -11
  15. data/polymorphic_integer_type.gemspec +2 -2
  16. data/spec/polymorphic_integer_type_spec.rb +75 -16
  17. data/spec/spec_helper.rb +17 -2
  18. data/spec/support/configuration.rb +2 -2
  19. data/spec/support/link.rb +0 -8
  20. data/spec/support/migrations/1_create_link_table.rb +1 -1
  21. data/spec/support/migrations/2_create_animal_table.rb +1 -1
  22. data/spec/support/migrations/3_create_person_table.rb +1 -1
  23. data/spec/support/migrations/4_create_food_table.rb +1 -1
  24. data/spec/support/migrations/5_create_drink_table.rb +1 -1
  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_plant.rb +11 -0
  29. metadata +23 -15
  30. data/gemfiles/Gemfile.rails-4.2-stable +0 -8
  31. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -68
  32. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -66
  33. data/gemfiles/Gemfile.rails-5.1-stable.lock +0 -66
  34. data/gemfiles/Gemfile.rails-5.2-stable.lock +0 -66
  35. data/lib/polymorphic_integer_type/activerecord_4/belongs_to_polymorphic_association_extension.rb +0 -10
  36. data/lib/polymorphic_integer_type/activerecord_4/predicate_builder_extension.rb +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffe9ae194b9a0be401d770ef0b2dbcef7ebf20f39a8d3c5a6c84bb8247085610
4
- data.tar.gz: 5df31e9e5463c7cf1ed62d3417d93a8162de83ad8d2bb9e7ace34eb995813491
3
+ metadata.gz: eb3b9a7f294ca84e3f4090aeb66dbd11046cb721e58b51b762d3fac2a77f90e3
4
+ data.tar.gz: 4b9ed1f6e1c36d98a573932bd747780aae00032e238ab8cf7385d6d12d6fb0a3
5
5
  SHA512:
6
- metadata.gz: 07d497236946c160efe5d19c19b6cd63254d79d45088794ba71f6e916ba96c5e65313151c57122010e4a72a354363b358da4fc4c29a96b921d29a574f2b7be13
7
- data.tar.gz: 36c0844e4b66881bd7df5052b0dd2d8dfa3de1a1505d5932c179721239a50efad292bb3f47a98d86ac16b6e74702158fc11c8da6a361483e20c5b045e39dc4bc
6
+ metadata.gz: 7a7cb4348a7be18c626d9a611a6005b991b6a09c016c0dd3908e10326da0bc8495072dfcf16ce998a55fce3c8f7bfbce34709df9b3882cceb01dbfe2ff274dc1
7
+ data.tar.gz: 1ddd7ed8095268053c37092ac0f1c8ebf73fee6111dc51bdda027dd4a2e3c4f23d92402ee60724c04f9d7737b06c8a022712683dc23503adf0f2c35b30090159
@@ -0,0 +1 @@
1
+ /.github/workflows/ @clio/application-security @clio/penguins
@@ -0,0 +1,34 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ gemfile:
17
+ - Gemfile.rails-5.0-stable
18
+ - Gemfile.rails-5.1-stable
19
+ - Gemfile.rails-5.2-stable
20
+ - Gemfile.rails-6.0-stable
21
+ - Gemfile.rails-6.1-stable
22
+ env:
23
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: "2.6"
30
+ - name: Install dependencies
31
+ run: bundle install
32
+ - name: Run tests
33
+ run:
34
+ bundle exec rspec
@@ -0,0 +1,30 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ release:
5
+ types: [ published ]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build + Publish
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+ - name: Set up Ruby 2.7
17
+ uses: actions/setup-ruby@v1
18
+ with:
19
+ ruby-version: 2.7.x
20
+
21
+ - name: Publish to RubyGems
22
+ env:
23
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
24
+ run: |
25
+ mkdir -p $HOME/.gem
26
+ touch $HOME/.gem/credentials
27
+ chmod 0600 $HOME/.gem/credentials
28
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
29
+ gem build *.gemspec
30
+ gem push *.gem
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
@@ -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,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-1-stable"
@@ -1,17 +1,36 @@
1
1
  module PolymorphicIntegerType
2
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
+
3
12
  def type_to_ids_mapping
4
- super.tap do |result|
13
+ if ACTIVE_RECORD_VERSION < Gem::Version.new("6.1")
5
14
  association = @associated_table.send(:association)
6
- klass = association.active_record
7
- name = association.name
15
+ else
16
+ association = @associated_table.send(:reflection)
17
+ end
18
+
19
+ name = association.name
20
+ default_hash = Hash.new { |hsh, key| hsh[key] = [] }
21
+ values.each_with_object(default_hash) do |value, hash|
22
+ klass = respond_to?(:klass, true) ? klass(value) : value.class
23
+ if association.active_record.respond_to?("#{name}_type_mapping")
24
+ mapping = association.active_record.send("#{name}_type_mapping")
25
+ key ||= mapping.key(klass.polymorphic_name) if klass.respond_to?(:polymorphic_name)
26
+ key ||= mapping.key(klass.sti_name)
27
+ key ||= mapping.key(klass.base_class.to_s)
28
+ key ||= mapping.key(klass.base_class.sti_name)
8
29
 
9
- if klass.respond_to?("#{name}_type_mapping")
10
- result.transform_keys! do |key|
11
- klass.send("#{name}_type_mapping").key(key)
12
- end
30
+ hash[key] << convert_to_id(value)
31
+ else
32
+ hash[klass.polymorphic_name] << convert_to_id(value)
13
33
  end
14
- result
15
34
  end
16
35
  end
17
36
  end
@@ -0,0 +1,19 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ class BelongsToPolymorphicAssociation < BelongsToAssociation
4
+ private
5
+
6
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new("6.1")
7
+ def replace_keys(record)
8
+ super
9
+ owner[reflection.foreign_type] = record.class.base_class unless record.nil?
10
+ end
11
+ elsif
12
+ def replace_keys(record, force: false)
13
+ super
14
+ owner[reflection.foreign_type] = record.class.base_class unless record.nil?
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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"
@@ -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.5"
2
+ VERSION = "3.1.1"
3
3
  end
@@ -3,19 +3,12 @@ ACTIVE_RECORD_VERSION = Gem::Version.new(ActiveRecord::VERSION::STRING)
3
3
  require "polymorphic_integer_type/version"
4
4
  require "polymorphic_integer_type/extensions"
5
5
  require "polymorphic_integer_type/mapping"
6
-
7
- if ACTIVE_RECORD_VERSION < Gem::Version.new("5")
8
- require "polymorphic_integer_type/activerecord_4/predicate_builder_extension"
9
- else
10
- require "polymorphic_integer_type/activerecord_5_0_0/polymorphic_array_value_extension"
11
- end
12
-
13
- if ACTIVE_RECORD_VERSION >= Gem::Version.new("5.0") && ACTIVE_RECORD_VERSION < Gem::Version.new("5.2.0")
14
- require "polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension"
15
- end
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"
16
9
 
17
10
  if ACTIVE_RECORD_VERSION < Gem::Version.new("5.2.0")
18
- require "polymorphic_integer_type/activerecord_4/belongs_to_polymorphic_association_extension"
11
+ require "polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension"
19
12
  end
20
13
 
21
14
  module PolymorphicIntegerType; 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", "< 7"
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 }
@@ -25,6 +69,25 @@ describe PolymorphicIntegerType do
25
69
  end
26
70
 
27
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"
@@ -54,6 +117,15 @@ describe PolymorphicIntegerType do
54
117
  it "properly finds the object with a find_by" do
55
118
  expect(Link.find_by(source: source, id: link.id)).to eql link
56
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
57
129
  end
58
130
 
59
131
  shared_examples "proper source" do
@@ -84,7 +156,6 @@ describe PolymorphicIntegerType do
84
156
  expect(source.source_links[0].source).to eql source
85
157
  end
86
158
  end
87
-
88
159
  end
89
160
  context "When a link is given polymorphic record" do
90
161
  let(:link) { Link.create(source: source) }
@@ -93,13 +164,11 @@ describe PolymorphicIntegerType do
93
164
 
94
165
  context "and when it already has a polymorphic record" do
95
166
  let(:target) { kibble }
96
- before { link.update_attributes(target: target) }
167
+ before { link.update(target: target) }
97
168
 
98
169
  include_examples "proper source"
99
170
  include_examples "proper target"
100
-
101
171
  end
102
-
103
172
  end
104
173
 
105
174
  context "When a link is given polymorphic id and type" do
@@ -109,12 +178,10 @@ describe PolymorphicIntegerType do
109
178
 
110
179
  context "and when it already has a polymorphic id and type" do
111
180
  let(:target) { kibble }
112
- 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) }
113
182
  include_examples "proper source"
114
183
  include_examples "proper target"
115
-
116
184
  end
117
-
118
185
  end
119
186
 
120
187
  context "When using a relation to the links with eager loading" do
@@ -127,9 +194,7 @@ describe PolymorphicIntegerType do
127
194
  it "should be able to return the links and the targets" do
128
195
  expect(cat.source_links).to match_array links
129
196
  expect(cat.source_links.includes(:target).collect(&:target)).to match_array [water, kibble]
130
-
131
197
  end
132
-
133
198
  end
134
199
 
135
200
  context "When using a through relation to the links with eager loading" do
@@ -142,9 +207,7 @@ describe PolymorphicIntegerType do
142
207
  it "should be able to return the links and the targets" do
143
208
  expect(owner.pet_source_links).to match_array links
144
209
  expect(owner.pet_source_links.includes(:target).collect(&:target)).to match_array [water, kibble]
145
-
146
210
  end
147
-
148
211
  end
149
212
 
150
213
  context "When eager loading the polymorphic association" do
@@ -159,16 +222,12 @@ describe PolymorphicIntegerType do
159
222
  expect(links.first.source).to eql cat
160
223
  expect(links.last.source).to eql dog
161
224
  end
162
-
163
225
  end
164
226
 
165
227
  it "should be able to preload the association" do
166
228
  l = Link.includes(:source).where(id: link.id).first
167
229
  expect(l.source).to eql cat
168
230
  end
169
-
170
-
171
-
172
231
  end
173
232
 
174
233
  context "when the association is an STI table" do
@@ -220,7 +279,7 @@ describe PolymorphicIntegerType do
220
279
  include_examples "proper target"
221
280
 
222
281
  it "creates foreign_type mapping method" do
223
- 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"})
224
283
  expect(InlineLink.source_type_mapping).to eq({10 => "Person", 11 => "InlineAnimal"})
225
284
  end
226
285
 
data/spec/spec_helper.rb CHANGED
@@ -5,18 +5,33 @@ 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'
12
14
  require 'byebug'
15
+ require 'pry'
13
16
 
14
17
  RSpec.configure do |config|
15
18
  config.before(:suite) do
16
19
  database_config = YAML.load(File.open("#{File.dirname(__FILE__)}/support/database.yml"))
20
+ migrations_path = "#{File.dirname(__FILE__)}/support/migrations"
21
+ active_record_version = Gem::Version.new(ActiveRecord::VERSION::STRING)
22
+
17
23
  ActiveRecord::Base.establish_connection(database_config)
18
- if Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new("5.2.0")
19
- ActiveRecord::MigrationContext.new("#{File.dirname(__FILE__)}/support/migrations").migrate
24
+
25
+ if active_record_version < Gem::Version.new("5.2")
26
+ ActiveRecord::Migrator.migrate(migrations_path)
27
+ end
28
+
29
+ if active_record_version >= Gem::Version.new("5.2") && active_record_version < Gem::Version.new("6.0")
30
+ ActiveRecord::MigrationContext.new(migrations_path).migrate
31
+ end
32
+
33
+ if active_record_version >= Gem::Version.new("6.0")
34
+ ActiveRecord::MigrationContext.new(migrations_path, ActiveRecord::SchemaMigration).migrate
20
35
  end
21
36
  end
22
37
 
@@ -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
@@ -1,4 +1,4 @@
1
- class CreateLinkTable < ActiveRecord::Migration[5.2]
1
+ class CreateLinkTable < ActiveRecord::Migration[5.0]
2
2
 
3
3
  def up
4
4
  create_table :links do |t|
@@ -1,4 +1,4 @@
1
- class CreateAnimalTable < ActiveRecord::Migration[5.2]
1
+ class CreateAnimalTable < ActiveRecord::Migration[5.0]
2
2
 
3
3
  def up
4
4
  create_table :animals do |t|
@@ -1,4 +1,4 @@
1
- class CreatePersonTable < ActiveRecord::Migration[5.2]
1
+ class CreatePersonTable < ActiveRecord::Migration[5.0]
2
2
 
3
3
  def up
4
4
  create_table :people do |t|
@@ -1,4 +1,4 @@
1
- class CreateFoodTable < ActiveRecord::Migration[5.2]
1
+ class CreateFoodTable < ActiveRecord::Migration[5.0]
2
2
 
3
3
  def up
4
4
  create_table :foods do |t|
@@ -1,4 +1,4 @@
1
- class CreateDrinkTable < ActiveRecord::Migration[5.2]
1
+ class CreateDrinkTable < ActiveRecord::Migration[5.0]
2
2
 
3
3
  def up
4
4
  create_table :drinks do |t|
@@ -0,0 +1,17 @@
1
+ class CreatePlantTable < ActiveRecord::Migration[5.0]
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.0]
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
+
@@ -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.5
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle d'Oliveira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2021-11-04 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: '7'
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: '7'
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
  - - ">="
@@ -102,27 +102,27 @@ executables:
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
+ - ".github/CODEOWNERS"
106
+ - ".github/workflows/ci.yml"
107
+ - ".github/workflows/gem-push.yml"
105
108
  - ".gitignore"
106
109
  - Gemfile
107
110
  - LICENSE.txt
108
111
  - README.md
109
112
  - Rakefile
110
113
  - bin/setup
111
- - gemfiles/Gemfile.rails-4.2-stable
112
- - gemfiles/Gemfile.rails-4.2-stable.lock
113
114
  - gemfiles/Gemfile.rails-5.0-stable
114
- - gemfiles/Gemfile.rails-5.0-stable.lock
115
115
  - gemfiles/Gemfile.rails-5.1-stable
116
- - gemfiles/Gemfile.rails-5.1-stable.lock
117
116
  - gemfiles/Gemfile.rails-5.2-stable
118
- - gemfiles/Gemfile.rails-5.2-stable.lock
117
+ - gemfiles/Gemfile.rails-6.0-stable
118
+ - gemfiles/Gemfile.rails-6.1-stable
119
119
  - lib/polymorphic_integer_type.rb
120
- - lib/polymorphic_integer_type/activerecord_4/belongs_to_polymorphic_association_extension.rb
121
- - lib/polymorphic_integer_type/activerecord_4/predicate_builder_extension.rb
122
120
  - lib/polymorphic_integer_type/activerecord_5_0_0/association_query_handler_extension.rb
123
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
124
123
  - lib/polymorphic_integer_type/extensions.rb
125
124
  - lib/polymorphic_integer_type/mapping.rb
125
+ - lib/polymorphic_integer_type/module_generator.rb
126
126
  - lib/polymorphic_integer_type/version.rb
127
127
  - polymorphic_integer_type.gemspec
128
128
  - spec/polymorphic_integer_type_spec.rb
@@ -139,7 +139,11 @@ files:
139
139
  - spec/support/migrations/3_create_person_table.rb
140
140
  - spec/support/migrations/4_create_food_table.rb
141
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
142
145
  - spec/support/namespaced_animal.rb
146
+ - spec/support/namespaced_plant.rb
143
147
  - spec/support/person.rb
144
148
  homepage: ''
145
149
  licenses:
@@ -160,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
164
  - !ruby/object:Gem::Version
161
165
  version: '0'
162
166
  requirements: []
163
- rubygems_version: 3.0.6
167
+ rubygems_version: 3.1.6
164
168
  signing_key:
165
169
  specification_version: 4
166
170
  summary: Use integers rather than strings for the _type field
@@ -179,5 +183,9 @@ test_files:
179
183
  - spec/support/migrations/3_create_person_table.rb
180
184
  - spec/support/migrations/4_create_food_table.rb
181
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
182
189
  - spec/support/namespaced_animal.rb
190
+ - spec/support/namespaced_plant.rb
183
191
  - spec/support/person.rb
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gemspec path: ".."
6
-
7
- gem "activerecord", github: "rails/rails", branch: "4-2-stable"
8
- gem "sqlite3", "~> 1.3.6"
@@ -1,68 +0,0 @@
1
- GIT
2
- remote: git://github.com/rails/rails.git
3
- revision: e9d6b85f3e834ceea2aeabe4cbaa96a7c73eb896
4
- branch: 4-2-stable
5
- specs:
6
- activemodel (4.2.11.1)
7
- activesupport (= 4.2.11.1)
8
- builder (~> 3.1)
9
- activerecord (4.2.11.1)
10
- activemodel (= 4.2.11.1)
11
- activesupport (= 4.2.11.1)
12
- arel (~> 6.0)
13
- activesupport (4.2.11.1)
14
- i18n (~> 0.7)
15
- minitest (~> 5.1)
16
- thread_safe (~> 0.3, >= 0.3.4)
17
- tzinfo (~> 1.1)
18
-
19
- PATH
20
- remote: ..
21
- specs:
22
- polymorphic_integer_type (2.2.4)
23
- activerecord
24
-
25
- GEM
26
- remote: https://rubygems.org/
27
- specs:
28
- arel (6.0.4)
29
- builder (3.2.4)
30
- byebug (11.0.1)
31
- concurrent-ruby (1.1.5)
32
- diff-lcs (1.3)
33
- i18n (0.9.5)
34
- concurrent-ruby (~> 1.0)
35
- minitest (5.13.0)
36
- rake (13.0.1)
37
- rspec (3.9.0)
38
- rspec-core (~> 3.9.0)
39
- rspec-expectations (~> 3.9.0)
40
- rspec-mocks (~> 3.9.0)
41
- rspec-core (3.9.0)
42
- rspec-support (~> 3.9.0)
43
- rspec-expectations (3.9.0)
44
- diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.9.0)
46
- rspec-mocks (3.9.0)
47
- diff-lcs (>= 1.2.0, < 2.0)
48
- rspec-support (~> 3.9.0)
49
- rspec-support (3.9.0)
50
- sqlite3 (1.3.13)
51
- thread_safe (0.3.6)
52
- tzinfo (1.2.5)
53
- thread_safe (~> 0.1)
54
-
55
- PLATFORMS
56
- ruby
57
-
58
- DEPENDENCIES
59
- activerecord!
60
- bundler
61
- byebug
62
- polymorphic_integer_type!
63
- rake
64
- rspec
65
- sqlite3 (~> 1.3.6)
66
-
67
- BUNDLED WITH
68
- 1.16.1
@@ -1,66 +0,0 @@
1
- GIT
2
- remote: git://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 (2.2.4)
22
- activerecord
23
-
24
- GEM
25
- remote: https://rubygems.org/
26
- specs:
27
- arel (7.1.4)
28
- byebug (11.0.1)
29
- concurrent-ruby (1.1.5)
30
- diff-lcs (1.3)
31
- i18n (1.7.0)
32
- concurrent-ruby (~> 1.0)
33
- minitest (5.13.0)
34
- rake (13.0.1)
35
- rspec (3.9.0)
36
- rspec-core (~> 3.9.0)
37
- rspec-expectations (~> 3.9.0)
38
- rspec-mocks (~> 3.9.0)
39
- rspec-core (3.9.0)
40
- rspec-support (~> 3.9.0)
41
- rspec-expectations (3.9.0)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.9.0)
44
- rspec-mocks (3.9.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.9.0)
47
- rspec-support (3.9.0)
48
- sqlite3 (1.3.13)
49
- thread_safe (0.3.6)
50
- tzinfo (1.2.5)
51
- thread_safe (~> 0.1)
52
-
53
- PLATFORMS
54
- ruby
55
-
56
- DEPENDENCIES
57
- activerecord!
58
- bundler
59
- byebug
60
- polymorphic_integer_type!
61
- rake
62
- rspec
63
- sqlite3 (~> 1.3.6)
64
-
65
- BUNDLED WITH
66
- 1.16.1
@@ -1,66 +0,0 @@
1
- GIT
2
- remote: git://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 (2.2.4)
22
- activerecord
23
-
24
- GEM
25
- remote: https://rubygems.org/
26
- specs:
27
- arel (8.0.0)
28
- byebug (11.0.1)
29
- concurrent-ruby (1.1.5)
30
- diff-lcs (1.3)
31
- i18n (1.7.0)
32
- concurrent-ruby (~> 1.0)
33
- minitest (5.13.0)
34
- rake (13.0.1)
35
- rspec (3.9.0)
36
- rspec-core (~> 3.9.0)
37
- rspec-expectations (~> 3.9.0)
38
- rspec-mocks (~> 3.9.0)
39
- rspec-core (3.9.0)
40
- rspec-support (~> 3.9.0)
41
- rspec-expectations (3.9.0)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.9.0)
44
- rspec-mocks (3.9.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.9.0)
47
- rspec-support (3.9.0)
48
- sqlite3 (1.4.2)
49
- thread_safe (0.3.6)
50
- tzinfo (1.2.5)
51
- thread_safe (~> 0.1)
52
-
53
- PLATFORMS
54
- ruby
55
-
56
- DEPENDENCIES
57
- activerecord!
58
- bundler
59
- byebug
60
- polymorphic_integer_type!
61
- rake
62
- rspec
63
- sqlite3
64
-
65
- BUNDLED WITH
66
- 1.16.1
@@ -1,66 +0,0 @@
1
- GIT
2
- remote: git://github.com/rails/rails.git
3
- revision: 892eab777c418135ce0646e91bc9ebb08a29ab9b
4
- branch: 5-2-stable
5
- specs:
6
- activemodel (5.2.4.1)
7
- activesupport (= 5.2.4.1)
8
- activerecord (5.2.4.1)
9
- activemodel (= 5.2.4.1)
10
- activesupport (= 5.2.4.1)
11
- arel (>= 9.0)
12
- activesupport (5.2.4.1)
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 (2.2.4)
22
- activerecord
23
-
24
- GEM
25
- remote: https://rubygems.org/
26
- specs:
27
- arel (9.0.0)
28
- byebug (11.0.1)
29
- concurrent-ruby (1.1.5)
30
- diff-lcs (1.3)
31
- i18n (1.7.0)
32
- concurrent-ruby (~> 1.0)
33
- minitest (5.13.0)
34
- rake (13.0.1)
35
- rspec (3.9.0)
36
- rspec-core (~> 3.9.0)
37
- rspec-expectations (~> 3.9.0)
38
- rspec-mocks (~> 3.9.0)
39
- rspec-core (3.9.0)
40
- rspec-support (~> 3.9.0)
41
- rspec-expectations (3.9.0)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.9.0)
44
- rspec-mocks (3.9.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.9.0)
47
- rspec-support (3.9.0)
48
- sqlite3 (1.4.2)
49
- thread_safe (0.3.6)
50
- tzinfo (1.2.5)
51
- thread_safe (~> 0.1)
52
-
53
- PLATFORMS
54
- ruby
55
-
56
- DEPENDENCIES
57
- activerecord!
58
- bundler
59
- byebug
60
- polymorphic_integer_type!
61
- rake
62
- rspec
63
- sqlite3
64
-
65
- BUNDLED WITH
66
- 1.16.1
@@ -1,10 +0,0 @@
1
- module ActiveRecord
2
- module Associations
3
- class BelongsToPolymorphicAssociation < BelongsToAssociation
4
- private def replace_keys(record)
5
- super
6
- owner[reflection.foreign_type] = record.class.base_class
7
- end
8
- end
9
- end
10
- end
@@ -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)