polymorphic_integer_type 2.0.0 → 2.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08271771790e3d2546b8584b6fe792c8f494b640
4
- data.tar.gz: 27d420188711bc29f27712c91d8cb8e386ff8f8b
3
+ metadata.gz: 84ff86a8b1c1b2d27d9834ba6bfb1a5713968e42
4
+ data.tar.gz: 72f17ee895418f4a1a7db952ce135ebadb0521d4
5
5
  SHA512:
6
- metadata.gz: c2bfd9fc2c3a12b560cf8bd3ddc2c8863b434d21253b552f854d1fcc20ed5584c9f514d1cfed66e38873324f7af6e3a4e780d5b23ba28d0287b6c8a2a8d41b1b
7
- data.tar.gz: c293b70d040633371e16e5cad37c4a93005170f9be936202f8e74ec671ccdfc843214fb86c2ecf6587de5b1c252691d02f9daaf49e8219b4c51fb0cfeaaa5f94
6
+ metadata.gz: a333e4a0da4f90c6a7ee1e0b304303b17d29fe8be6745f17e02b6e5ddf6cd1d2eb7c77d9ee26281106f5c066cbbea6be89c28ee31974fa9b5642adba4687675e
7
+ data.tar.gz: 9c4ccc617103c6b818ae219bacc43c5513dac9995617fa3078db10bdfab1eb78c0d632b68d9a73fd628d5c7349031aaf08c63f367614adce6c1e59876f43ae7b
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # PolymorphicIntegerType
2
2
 
3
3
  Rails' polymorphic associations are pretty useful. The example they give to set it up looks like:
4
+
4
5
  ```ruby
5
6
  class Picture < ActiveRecord::Base
6
7
  belongs_to :imageable, polymorphic: true
@@ -16,6 +17,7 @@ end
16
17
  ```
17
18
 
18
19
  With a migration that looks like:
20
+
19
21
  ```ruby
20
22
  class CreatePictures < ActiveRecord::Migration
21
23
  def change
@@ -49,38 +51,48 @@ For Rails 3.2 use version < 2. Version >= 2 has been tested on Rails 4.2 and Rub
49
51
 
50
52
  ## Usage
51
53
 
52
- The gem is pretty straightforward to use.
54
+ 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.
53
55
 
54
- First, include the extensions module and add the `integer_type` option to the associations that are going to be using this. (That way it will play nicely with polymorphic associations whose type you would rather leave as a string.)
55
56
  ```ruby
56
57
  class Picture < ActiveRecord::Base
57
58
  include PolymorphicIntegerType::Extensions
58
- belongs_to :imageable, polymorphic: true, integer_type: true
59
+
60
+ belongs_to :imageable, polymorphic: {1 => "Employee", 2 => "Product"}
59
61
  end
62
+ ```
60
63
 
64
+ 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
+
66
+ ```ruby
61
67
  class Employee < ActiveRecord::Base
62
68
  include PolymorphicIntegerType::Extensions
63
- has_many :pictures, as: :imageable, integer_type: true
69
+
70
+ has_many :pictures, as: :imageable
64
71
  end
65
72
 
66
73
  class Product < ActiveRecord::Base
67
74
  include PolymorphicIntegerType::Extensions
68
- has_many :pictures, as: :imageable, integer_type: true
75
+
76
+ has_many :pictures, as: :imageable
69
77
  end
70
78
  ```
71
79
 
72
- Second, you need to create a mapping for the polymorphic associations. This should be loaded before the models. Putting it in an initializer is good (`config/initializers/polymorphic_type_mapping.rb`)
73
- ```ruby
74
- PolymorphicIntegerType::Mapping.configuration do |config|
80
+ ### External mappings
75
81
 
76
- config.add :imageable, {1 => "Employee", 2 => "Product" }
82
+ You can also store polymorphic type mappings separate from your models. This should be loaded before the models. Putting it in an initializer is one way to do this (e.g., `config/initializers/polymorphic_type_mapping.rb`)
77
83
 
84
+ ```ruby
85
+ PolymorphicIntegerType::Mapping.configuration do |config|
86
+ config.add :imageable, {1 => "Employee", 2 => "Product" }
78
87
  end
79
88
  ```
80
89
 
81
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.
82
91
 
92
+ ### Migrating an existing association
93
+
83
94
  If you want to convert a polymorphic association that is already a string, you'll need to set up a migration. (Assuming SQL for the time being, but this should be pretty straightforward.)
95
+
84
96
  ```ruby
85
97
  class PictureToPolymorphicIntegerType < ActiveRecord::Migration
86
98
 
@@ -125,8 +137,18 @@ end
125
137
  ```
126
138
 
127
139
  Lastly, you will need to be careful of any place where you are doing raw SQL queries with the string (`imageable_type = 'Employee'`). They should use the integer instead.
128
-
129
140
 
141
+ ## Setup
142
+
143
+ You'll need to have git, Ruby, and MySQL. Then get up and running with a few commands:
144
+
145
+ ```bash
146
+ $ git clone ...
147
+ $ bundle install
148
+ $ vim spec/support/database.yml # Update username and password
149
+ $ bin/setup
150
+ $ bundle exec rspec
151
+ ```
130
152
 
131
153
  ## Contributing
132
154
 
data/Rakefile CHANGED
@@ -1 +1,39 @@
1
1
  require "bundler/gem_tasks"
2
+ require "yaml"
3
+ require "active_record"
4
+
5
+ namespace :db do
6
+ database_config = YAML.load(File.open("./spec/support/database.yml"))
7
+ admin_database_config = database_config.merge(database: "mysql")
8
+ migration_path = File.expand_path("./spec/support/migrations")
9
+
10
+ desc "Create the database"
11
+ task :create do
12
+ ActiveRecord::Base.establish_connection(admin_database_config)
13
+ ActiveRecord::Base.connection.create_database(database_config.fetch(:database))
14
+ puts "Database created."
15
+ end
16
+
17
+ desc "Migrate the database"
18
+ task :migrate do
19
+ ActiveRecord::Base.establish_connection(database_config)
20
+ ActiveRecord::Migrator.migrate(migration_path)
21
+ Rake::Task["db:schema"].invoke
22
+ puts "Database migrated."
23
+ end
24
+
25
+ desc "Drop the database"
26
+ task :drop do
27
+ ActiveRecord::Base.establish_connection(admin_database_config)
28
+ ActiveRecord::Base.connection.drop_database(database_config.fetch(:database))
29
+ puts "Database deleted."
30
+ end
31
+
32
+ desc "Reset the database"
33
+ task reset: [:drop, :create, :migrate]
34
+ desc 'Create a db/schema.rb file that is portable against any DB supported by AR'
35
+
36
+ task :schema do
37
+ # Noop to make ActiveRecord happy
38
+ end
39
+ end
data/bin/setup ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ bundle exec rake db:drop db:create db:migrate
@@ -7,10 +7,22 @@ module PolymorphicIntegerType
7
7
  options = scope if scope.kind_of? Hash
8
8
  integer_type = options.delete :integer_type
9
9
  super
10
- if options[:polymorphic] && integer_type
11
- mapping = PolymorphicIntegerType::Mapping[name]
10
+ if options[:polymorphic] && (integer_type || options[:polymorphic].is_a?(Hash))
11
+ mapping =
12
+ case integer_type
13
+ when true then PolymorphicIntegerType::Mapping[name]
14
+ when nil then options[:polymorphic]
15
+ else
16
+ raise ArgumentError, "Unknown integer_type value: #{integer_type.inspect}"
17
+ end.dup
18
+
12
19
  foreign_type = reflections[name.to_s].foreign_type
13
- self._polymorphic_foreign_types << foreign_type
20
+ _polymorphic_foreign_types << foreign_type
21
+
22
+ # Required way to dynamically define a class method on the model
23
+ singleton_class.__send__(:define_method, "#{foreign_type}_mapping") do
24
+ mapping
25
+ end
14
26
 
15
27
  define_method foreign_type do
16
28
  t = super()
@@ -40,11 +52,23 @@ module PolymorphicIntegerType
40
52
 
41
53
  def remove_type_and_establish_mapping(name, options, scope)
42
54
  integer_type = options.delete :integer_type
43
- if options[:as] && integer_type
55
+ polymorphic_type_mapping = retrieve_polymorphic_type_mapping(
56
+ polymorphic_type: options[:as],
57
+ class_name: options[:class_name] || name.to_s.classify
58
+ )
59
+
60
+ if options[:as] && (polymorphic_type_mapping || integer_type)
44
61
  poly_type = options.delete(:as)
45
- mapping = PolymorphicIntegerType::Mapping[poly_type]
46
- klass_mapping = (mapping||{}).key self.sti_name
47
- raise "Polymorphic Class Mapping is missing for #{poly_type}" unless klass_mapping
62
+ polymorphic_type_mapping ||= PolymorphicIntegerType::Mapping[poly_type]
63
+ if polymorphic_type_mapping == nil
64
+ raise "Polymorphic type mapping missing for #{poly_type.inspect}"
65
+ end
66
+
67
+ klass_mapping = (polymorphic_type_mapping || {}).key(sti_name)
68
+
69
+ if klass_mapping == nil
70
+ raise "Class not found for #{sti_name.inspect} in polymorphic type mapping: #{polymorphic_type_mapping}"
71
+ end
48
72
 
49
73
  options[:foreign_key] ||= "#{poly_type}_id"
50
74
  foreign_type = options.delete(:foreign_type) || "#{poly_type}_type"
@@ -59,6 +83,17 @@ module PolymorphicIntegerType
59
83
  end
60
84
  end
61
85
 
86
+ def retrieve_polymorphic_type_mapping(polymorphic_type:, class_name:)
87
+ return if polymorphic_type.nil?
88
+
89
+ belongs_to_class = class_name.safe_constantize
90
+ method_name = "#{polymorphic_type}_type_mapping"
91
+
92
+ if belongs_to_class && belongs_to_class.respond_to?(method_name)
93
+ belongs_to_class.public_send(method_name)
94
+ end
95
+ end
96
+
62
97
  def has_many(name, scope = nil, options = {}, &extension)
63
98
  if scope.kind_of? Hash
64
99
  options = scope
@@ -1,3 +1,3 @@
1
1
  module PolymorphicIntegerType
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -24,5 +24,4 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "activerecord", "4.2.0"
25
25
  spec.add_development_dependency "mysql2", "0.3.16"
26
26
  spec.add_development_dependency "byebug"
27
-
28
27
  end
@@ -1,21 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PolymorphicIntegerType do
4
+ let(:owner) { Person.create(name: "Kyle") }
5
+ let(:dog) { Animal.create(name: "Bela", kind: "Dog", owner: owner) }
6
+ let(:cat) { Animal.create(name: "Alexi", kind: "Cat") }
4
7
 
5
- let(:owner) { Person.create(:name => "Kyle") }
6
- let(:dog) { Animal.create(:name => "Bela", :kind => "Dog", :owner => owner) }
7
- let(:cat) { Animal.create(:name => "Alexi", :kind => "Cat") }
8
+ let(:kibble) { Food.create(name: "Kibble") }
9
+ let(:chocolate) { Food.create(name: "Choclate") }
8
10
 
11
+ let(:milk) { Drink.create(name: "milk") }
12
+ let(:water) { Drink.create(name: "Water") }
13
+ let(:whiskey) { Drink.create(name: "Whiskey") }
9
14
 
10
- let(:kibble) { Food.create(:name => "Kibble") }
11
- let(:chocolate) { Food.create(:name => "Choclate") }
12
-
13
-
14
- let(:milk) { Drink.create(:name => "milk") }
15
- let(:water) { Drink.create(:name => "Water") }
16
- let(:whiskey) { Drink.create(:name => "Whiskey") }
17
-
18
- let(:link) { Link.create(:source => source, :target => target) }
15
+ let(:link) { Link.create(source: source, target: target) }
19
16
 
20
17
  context "when the source is nil" do
21
18
  let(:source) { nil }
@@ -58,13 +55,13 @@ describe PolymorphicIntegerType do
58
55
 
59
56
  end
60
57
  context "When a link is given polymorphic record" do
61
- let(:link) { Link.create(:source => source) }
58
+ let(:link) { Link.create(source: source) }
62
59
  let(:source) { cat }
63
60
  include_examples "proper source"
64
61
 
65
62
  context "and when it already has a polymorphic record" do
66
63
  let(:target) { kibble }
67
- before { link.update_attributes(:target => target) }
64
+ before { link.update_attributes(target: target) }
68
65
 
69
66
  include_examples "proper source"
70
67
  include_examples "proper target"
@@ -74,13 +71,13 @@ describe PolymorphicIntegerType do
74
71
  end
75
72
 
76
73
  context "When a link is given polymorphic id and type" do
77
- let(:link) { Link.create(:source_id => source.id, :source_type => source.class.to_s) }
74
+ let(:link) { Link.create(source_id: source.id, source_type: source.class.to_s) }
78
75
  let(:source) { cat }
79
76
  include_examples "proper source"
80
77
 
81
78
  context "and when it already has a polymorphic id and type" do
82
79
  let(:target) { kibble }
83
- before { link.update_attributes(:target_id => target.id, :target_type => target.class.to_s) }
80
+ before { link.update_attributes(target_id: target.id, target_type: target.class.to_s) }
84
81
  include_examples "proper source"
85
82
  include_examples "proper target"
86
83
 
@@ -90,8 +87,8 @@ describe PolymorphicIntegerType do
90
87
 
91
88
  context "When using a relation to the links with eagar loading" do
92
89
  let!(:links){
93
- [Link.create(:source => source, :target => kibble),
94
- Link.create(:source => source, :target => water)]
90
+ [Link.create(source: source, target: kibble),
91
+ Link.create(source: source, target: water)]
95
92
  }
96
93
  let(:source) { cat }
97
94
 
@@ -105,8 +102,8 @@ describe PolymorphicIntegerType do
105
102
 
106
103
  context "When using a through relation to the links with eagar loading" do
107
104
  let!(:links){
108
- [Link.create(:source => source, :target => kibble),
109
- Link.create(:source => source, :target => water)]
105
+ [Link.create(source: source, target: kibble),
106
+ Link.create(source: source, target: water)]
110
107
  }
111
108
  let(:source) { dog }
112
109
 
@@ -119,14 +116,14 @@ describe PolymorphicIntegerType do
119
116
  end
120
117
 
121
118
  context "When eagar loading the polymorphic association" do
122
- let(:link) { Link.create(:source_id => source.id, :source_type => source.class.to_s) }
119
+ let(:link) { Link.create(source_id: source.id, source_type: source.class.to_s) }
123
120
  let(:source) { cat }
124
121
 
125
122
  context "and when there are multiples sources" do
126
- let(:link_2) { Link.create(:source_id => source_2.id, :source_type => source_2.class.to_s) }
123
+ let(:link_2) { Link.create(source_id: source_2.id, source_type: source_2.class.to_s) }
127
124
  let(:source_2) { dog }
128
125
  it "should be able to preload both associations" do
129
- links = Link.includes(:source).where(:id => [link.id, link_2.id]).order(:id)
126
+ links = Link.includes(:source).where(id: [link.id, link_2.id]).order(:id)
130
127
  expect(links.first.source).to eql cat
131
128
  expect(links.last.source).to eql dog
132
129
  end
@@ -134,7 +131,7 @@ describe PolymorphicIntegerType do
134
131
  end
135
132
 
136
133
  it "should be able to preload the association" do
137
- l = Link.includes(:source).where(:id => link.id).first
134
+ l = Link.includes(:source).where(id: link.id).first
138
135
  expect(l.source).to eql cat
139
136
  end
140
137
 
@@ -142,8 +139,8 @@ describe PolymorphicIntegerType do
142
139
  end
143
140
 
144
141
  context "when the association is an STI table" do
145
- let(:link) { Link.create(:source => source, :target => whiskey) }
146
- let(:source) { Dog.create(:name => "Bela", :kind => "Dog", :owner => owner) }
142
+ let(:link) { Link.create(source: source, target: whiskey) }
143
+ let(:source) { Dog.create(name: "Bela", kind: "Dog", owner: owner) }
147
144
  it "should have the proper id, type and object for the source" do
148
145
  expect(link.source_id).to eql source.id
149
146
  expect(link.source_type).to eql "Animal"
@@ -151,5 +148,109 @@ describe PolymorphicIntegerType do
151
148
  end
152
149
  end
153
150
 
151
+ context "when mapping is given inline in the belongs_to model" do
152
+ class InlineLink < ActiveRecord::Base
153
+ include PolymorphicIntegerType::Extensions
154
+
155
+ self.table_name = "links"
156
+
157
+ belongs_to :source, polymorphic: {10 => "Person", 11 => "InlineAnimal"}
158
+ belongs_to :target, polymorphic: {10 => "Food", 13 => "InlineDrink"}
159
+ belongs_to :normal_target, polymorphic: true
160
+ end
161
+
162
+ class InlineAnimal < ActiveRecord::Base
163
+ include PolymorphicIntegerType::Extensions
164
+
165
+ self.table_name = "animals"
166
+
167
+ belongs_to :owner, class_name: "Person"
168
+ has_many :source_links, as: :source, class_name: "InlineLink"
169
+ end
170
+
171
+ class InlineDrink < ActiveRecord::Base
172
+ include PolymorphicIntegerType::Extensions
173
+
174
+ self.table_name = "drinks"
154
175
 
176
+ has_many :inline_links, as: :target
177
+ end
178
+
179
+ let!(:animal) { InlineAnimal.create!(name: "Lucy") }
180
+ let!(:drink) { InlineDrink.create!(name: "Water") }
181
+ let!(:link) { InlineLink.create!(source: animal, target: drink, normal_target: drink) }
182
+
183
+ let(:source) { animal }
184
+ let(:target) { drink }
185
+
186
+ include_examples "proper source"
187
+ include_examples "proper target"
188
+
189
+ it "creates foreign_type mapping method" do
190
+ expect(Link.source_type_mapping).to eq({0 => "Person", 1 => "Animal"})
191
+ expect(InlineLink.source_type_mapping).to eq({10 => "Person", 11 => "InlineAnimal"})
192
+ end
193
+
194
+ it "pulls mapping from given hash" do
195
+ expect(link.source_id).to eq(animal.id)
196
+ expect(link[:source_type]).to eq(11)
197
+ expect(link.target_id).to eq(drink.id)
198
+ expect(link[:target_type]).to eq(13)
199
+ end
200
+
201
+ it "doesn't break string type polymorphic associations" do
202
+ expect(link.normal_target).to eq(drink)
203
+ expect(link.normal_target_type).to eq("InlineDrink")
204
+ end
205
+ end
206
+
207
+ context "when mapping assigned to `polymorphic` option on belongs_to model" do
208
+ class InlineLink2 < ActiveRecord::Base
209
+ include PolymorphicIntegerType::Extensions
210
+
211
+ self.table_name = "links"
212
+
213
+ belongs_to :source, polymorphic: {10 => "Person", 11 => "InlineAnimal2"}
214
+ belongs_to :target, polymorphic: {10 => "Food", 13 => "InlineDrink2"}
215
+ belongs_to :normal_target, polymorphic: true
216
+ end
217
+
218
+ class InlineAnimal2 < ActiveRecord::Base
219
+ include PolymorphicIntegerType::Extensions
220
+
221
+ self.table_name = "animals"
222
+
223
+ has_many :source_links, as: :source, class_name: "InlineLink2"
224
+ end
225
+
226
+ class InlineDrink2 < ActiveRecord::Base
227
+ include PolymorphicIntegerType::Extensions
228
+
229
+ self.table_name = "drinks"
230
+
231
+ has_many :inline_links2, as: :target
232
+ end
233
+
234
+ let!(:animal) { InlineAnimal2.create!(name: "Lucy") }
235
+ let!(:drink) { InlineDrink2.create!(name: "Water") }
236
+ let!(:link) { InlineLink2.create!(source: animal, target: drink, normal_target: drink) }
237
+
238
+ let(:source) { animal }
239
+ let(:target) { drink }
240
+
241
+ include_examples "proper source"
242
+ include_examples "proper target"
243
+
244
+ it "pulls mapping from given hash" do
245
+ expect(link.source_id).to eq(animal.id)
246
+ expect(link[:source_type]).to eq(11)
247
+ expect(link.target_id).to eq(drink.id)
248
+ expect(link[:target_type]).to eq(13)
249
+ end
250
+
251
+ it "doesn't break string type polymorphic associations" do
252
+ expect(link.normal_target).to eq(drink)
253
+ expect(link.normal_target_type).to eq("InlineDrink2")
254
+ end
255
+ end
155
256
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
- require 'support/active_record'
1
+ require 'yaml'
2
+ require 'active_record'
2
3
  require 'polymorphic_integer_type'
3
4
  require 'support/configuration'
4
5
  require 'support/link'
@@ -8,26 +9,16 @@ require 'support/person'
8
9
  require 'support/food'
9
10
  require 'support/drink'
10
11
 
11
-
12
-
13
12
  RSpec.configure do |config|
14
-
15
13
  config.before(:suite) do
16
- ActiveRecord::Migrator.up "#{File.dirname(__FILE__)}/support/migrations"
14
+ database_config = YAML.load(File.open("#{File.dirname(__FILE__)}/support/database.yml"))
15
+ ActiveRecord::Base.establish_connection(database_config)
17
16
  end
18
17
 
19
- # No need to return the run the down migration after the test
20
- # but useful while in development
21
- # config.after(:suite) do
22
- # ActiveRecord::Migrator.down "#{File.dirname(__FILE__)}/support/migrations"
23
- # end
24
-
25
-
26
18
  config.around do |example|
27
19
  ActiveRecord::Base.transaction do
28
20
  example.run
29
21
  raise ActiveRecord::Rollback
30
22
  end
31
23
  end
32
-
33
24
  end
@@ -1,10 +1,6 @@
1
1
  class Animal < ActiveRecord::Base
2
-
3
2
  include PolymorphicIntegerType::Extensions
4
3
 
5
- belongs_to :owner, :class_name => "Person"
6
- has_many :source_links, :as => :source, :integer_type => true, :class_name => "Link"
7
-
8
-
9
-
4
+ belongs_to :owner, class_name: "Person"
5
+ has_many :source_links, as: :source, integer_type: true, class_name: "Link"
10
6
  end
@@ -1,6 +1,4 @@
1
1
  PolymorphicIntegerType::Mapping.configuration do |config|
2
-
3
2
  config.add :source, {0 => "Person", 1 => "Animal"}
4
3
  config.add :target, {0 => "Food", 1 => "Drink"}
5
-
6
4
  end
@@ -0,0 +1,6 @@
1
+ ---
2
+ :adapter: mysql2
3
+ :host: localhost
4
+ :database: polymorphic_integer_type_test
5
+ :username: root
6
+ :password: ''
data/spec/support/dog.rb CHANGED
@@ -1,4 +1,2 @@
1
1
  class Dog < Animal
2
-
3
-
4
2
  end
@@ -1,9 +1,5 @@
1
1
  class Drink < ActiveRecord::Base
2
-
3
2
  include PolymorphicIntegerType::Extensions
4
3
 
5
- has_many :target_links, :as => :target, :integer_type => true, :class_name => "Link"
6
-
7
-
8
-
4
+ has_many :target_links, as: :target, integer_type: true, class_name: "Link"
9
5
  end
data/spec/support/food.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  class Food < ActiveRecord::Base
2
-
3
2
  include PolymorphicIntegerType::Extensions
4
3
 
5
- has_many :target_links, :as => :target, :integer_type => true, :class_name => "Link"
6
-
7
-
4
+ has_many :target_links, as: :target, integer_type: true, class_name: "Link"
8
5
  end
data/spec/support/link.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  class Link < ActiveRecord::Base
2
-
3
2
  include PolymorphicIntegerType::Extensions
4
3
 
5
- belongs_to :source, :polymorphic => true, :integer_type => true
6
- belongs_to :target, :polymorphic => true, :integer_type => true
7
-
4
+ belongs_to :source, polymorphic: true, integer_type: true
5
+ belongs_to :target, polymorphic: true, integer_type: true
8
6
  end
@@ -4,6 +4,8 @@ class CreateLinkTable < ActiveRecord::Migration
4
4
  create_table :links do |t|
5
5
  t.integer :target_id
6
6
  t.integer :target_type
7
+ t.integer :normal_target_id
8
+ t.string :normal_target_type
7
9
  t.integer :source_id
8
10
  t.integer :source_type
9
11
  end
@@ -1,11 +1,8 @@
1
1
  class Person < ActiveRecord::Base
2
-
3
2
  include PolymorphicIntegerType::Extensions
4
3
 
5
- has_many :pets, :class_name => "Animal", :foreign_key => :owner_id
6
- has_many :source_links, :as => :source, :integer_type => true, :class_name => "Link"
7
-
8
- has_many :pet_source_links, :class_name => "Link", :through => :pets, :source => :source_links
9
-
4
+ has_many :pets, class_name: "Animal", foreign_key: :owner_id
5
+ has_many :source_links, as: :source, integer_type: true, class_name: "Link"
10
6
 
7
+ has_many :pet_source_links, class_name: "Link", through: :pets, source: :source_links
11
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polymorphic_integer_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
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: 2015-01-10 00:00:00.000000000 Z
11
+ date: 2017-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,7 +97,8 @@ dependencies:
97
97
  description: Allows the *_type field in the DB to be an integer rather than a string
98
98
  email:
99
99
  - kyle@goclio.com
100
- executables: []
100
+ executables:
101
+ - setup
101
102
  extensions: []
102
103
  extra_rdoc_files: []
103
104
  files:
@@ -106,6 +107,7 @@ files:
106
107
  - LICENSE.txt
107
108
  - README.md
108
109
  - Rakefile
110
+ - bin/setup
109
111
  - lib/polymorphic_integer_type.rb
110
112
  - lib/polymorphic_integer_type/extensions.rb
111
113
  - lib/polymorphic_integer_type/mapping.rb
@@ -113,9 +115,9 @@ files:
113
115
  - polymorphic_integer_type.gemspec
114
116
  - spec/polymorphic_integer_type_spec.rb
115
117
  - spec/spec_helper.rb
116
- - spec/support/active_record.rb
117
118
  - spec/support/animal.rb
118
119
  - spec/support/configuration.rb
120
+ - spec/support/database.yml
119
121
  - spec/support/dog.rb
120
122
  - spec/support/drink.rb
121
123
  - spec/support/food.rb
@@ -146,16 +148,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
148
  version: '0'
147
149
  requirements: []
148
150
  rubyforge_project:
149
- rubygems_version: 2.2.2
151
+ rubygems_version: 2.6.14
150
152
  signing_key:
151
153
  specification_version: 4
152
154
  summary: Use integers rather than strings for the _type field
153
155
  test_files:
154
156
  - spec/polymorphic_integer_type_spec.rb
155
157
  - spec/spec_helper.rb
156
- - spec/support/active_record.rb
157
158
  - spec/support/animal.rb
158
159
  - spec/support/configuration.rb
160
+ - spec/support/database.yml
159
161
  - spec/support/dog.rb
160
162
  - spec/support/drink.rb
161
163
  - spec/support/food.rb
@@ -1,12 +0,0 @@
1
- require 'active_record'
2
- Dir["#{File.dirname(__FILE__)}/migrations/*.rb"].each {|f| require f}
3
-
4
- config = {
5
- :adapter => "mysql2",
6
- :host => "localhost",
7
- :database => "polymorphic_integer_type_test",
8
- :username => "root",
9
- :password => ""
10
- }
11
- ActiveRecord::Base.establish_connection(config)
12
-