schema_plus_foreign_keys 0.1.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/prs.yml +134 -0
- data/.gitignore +1 -0
- data/.simplecov +20 -0
- data/Gemfile +4 -1
- data/README.md +25 -18
- data/Rakefile +3 -1
- data/gemfiles/Gemfile.base +1 -1
- data/gemfiles/activerecord-5.2/Gemfile.base +2 -1
- data/gemfiles/activerecord-5.2/Gemfile.mysql2 +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.postgresql +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.sqlite3 +3 -3
- data/gemfiles/activerecord-6.0/Gemfile.base +4 -0
- data/gemfiles/activerecord-6.0/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-6.0/Gemfile.postgresql +10 -0
- data/gemfiles/{activerecord-4.2.0 → activerecord-6.0}/Gemfile.sqlite3 +3 -3
- data/lib/schema_plus/foreign_keys/active_record/base.rb +2 -0
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract/schema_creation.rb +2 -11
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract_adapter.rb +7 -47
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/foreign_key_definition.rb +4 -35
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/mysql2_adapter.rb +15 -16
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/postgresql_adapter.rb +8 -6
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/sqlite3_adapter.rb +8 -6
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/table_definition.rb +7 -46
- data/lib/schema_plus/foreign_keys/active_record/migration/command_recorder.rb +4 -2
- data/lib/schema_plus/foreign_keys/middleware/dumper.rb +4 -2
- data/lib/schema_plus/foreign_keys/middleware/migration.rb +13 -5
- data/lib/schema_plus/foreign_keys/middleware/model.rb +2 -0
- data/lib/schema_plus/foreign_keys/middleware/mysql.rb +3 -1
- data/lib/schema_plus/foreign_keys/middleware/sql.rb +2 -16
- data/lib/schema_plus/foreign_keys/version.rb +3 -1
- data/lib/schema_plus/foreign_keys.rb +2 -1
- data/lib/schema_plus_foreign_keys.rb +2 -0
- data/schema_dev.yml +4 -6
- data/schema_plus_foreign_keys.gemspec +10 -9
- data/spec/deprecation_spec.rb +11 -110
- data/spec/foreign_key_definition_spec.rb +5 -3
- data/spec/foreign_key_spec.rb +22 -20
- data/spec/migration_spec.rb +35 -59
- data/spec/named_schemas_spec.rb +16 -14
- data/spec/schema_dumper_spec.rb +13 -13
- data/spec/spec_helper.rb +4 -2
- data/spec/support/reference.rb +3 -2
- metadata +31 -89
- data/.travis.yml +0 -33
- data/gemfiles/activerecord-4.2.0/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.0/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.0/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.1/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.6/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.0/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.1/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.sqlite3 +0 -10
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module ActiveRecord
|
3
5
|
module ConnectionAdapters
|
@@ -61,12 +63,12 @@ module SchemaPlus::ForeignKeys
|
|
61
63
|
on_update = ForeignKeyDefinition::ACTION_LOOKUP[on_update] || :no_action
|
62
64
|
on_delete = ForeignKeyDefinition::ACTION_LOOKUP[on_delete] || :no_action
|
63
65
|
|
64
|
-
options = { :
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
66
|
+
options = { name: name,
|
67
|
+
on_delete: on_delete,
|
68
|
+
on_update: on_update,
|
69
|
+
column: columns,
|
70
|
+
primary_key: primary_keys,
|
71
|
+
deferrable: deferrable }
|
70
72
|
|
71
73
|
foreign_keys << ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
|
72
74
|
from_table,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module ActiveRecord
|
3
5
|
module ConnectionAdapters
|
@@ -59,12 +61,12 @@ module SchemaPlus::ForeignKeys
|
|
59
61
|
on_delete = ForeignKeyDefinition::ACTION_LOOKUP[on_delete] || :no_action
|
60
62
|
deferrable = deferrable ? (initially_deferred ? :initially_deferred : true) : false
|
61
63
|
|
62
|
-
options = { :
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
64
|
+
options = { name: name,
|
65
|
+
on_update: on_update,
|
66
|
+
on_delete: on_delete,
|
67
|
+
column: columns,
|
68
|
+
primary_key: primary_keys,
|
69
|
+
deferrable: deferrable }
|
68
70
|
|
69
71
|
foreign_keys << ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
|
70
72
|
from_table,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys::ActiveRecord::ConnectionAdapters
|
2
4
|
|
3
5
|
#
|
@@ -25,7 +27,7 @@ module SchemaPlus::ForeignKeys::ActiveRecord::ConnectionAdapters
|
|
25
27
|
# definition, via:
|
26
28
|
#
|
27
29
|
# create_table :widgets do |t|
|
28
|
-
# t.string :name, :
|
30
|
+
# t.string :name, index: true
|
29
31
|
# end
|
30
32
|
#
|
31
33
|
# For details about the :index option (including unique and multi-column indexes), see the
|
@@ -36,15 +38,15 @@ module SchemaPlus::ForeignKeys::ActiveRecord::ConnectionAdapters
|
|
36
38
|
# create_table :posts do |t| # not DRY
|
37
39
|
# t.references :author
|
38
40
|
# end
|
39
|
-
# add_foreign_key :posts, :author_id, :
|
41
|
+
# add_foreign_key :posts, :author_id, references: :authors
|
40
42
|
#
|
41
43
|
# create_table :posts do |t| # DRYer
|
42
44
|
# t.references :author
|
43
|
-
# t.foreign_key :author_id, :
|
45
|
+
# t.foreign_key :author_id, references: :authors
|
44
46
|
# end
|
45
47
|
#
|
46
48
|
# create_table :posts do |t| # Dryest
|
47
|
-
# t.references :author, :
|
49
|
+
# t.references :author, foreign_key: true
|
48
50
|
# end
|
49
51
|
#
|
50
52
|
# <b>NOTE:</b> In the standard configuration, SchemaPlus::ForeignKeys automatically
|
@@ -59,7 +61,7 @@ module SchemaPlus::ForeignKeys::ActiveRecord::ConnectionAdapters
|
|
59
61
|
# Finally, the configuration for foreign keys can be overriden on a per-table
|
60
62
|
# basis by passing Config options to Migration::ClassMethods#create_table, such as
|
61
63
|
#
|
62
|
-
# create_table :students, :
|
64
|
+
# create_table :students, foreign_keys: {auto_create: false} do
|
63
65
|
# t.references :student
|
64
66
|
# end
|
65
67
|
#
|
@@ -67,46 +69,5 @@ module SchemaPlus::ForeignKeys::ActiveRecord::ConnectionAdapters
|
|
67
69
|
|
68
70
|
attr_accessor :schema_plus_foreign_keys_config #:nodoc:
|
69
71
|
|
70
|
-
if Gem::Requirement.new('= 4.2.0').satisfied_by?(::ActiveRecord.version)
|
71
|
-
def foreign_keys
|
72
|
-
@foreign_keys ||= []
|
73
|
-
end
|
74
|
-
|
75
|
-
def foreign_keys_for_table(*)
|
76
|
-
foreign_keys
|
77
|
-
end
|
78
|
-
elsif Gem::Requirement.new('< 4.2.6').satisfied_by?(::ActiveRecord.version)
|
79
|
-
def foreign_keys_for_table(table)
|
80
|
-
foreign_keys[table] ||= []
|
81
|
-
end
|
82
|
-
else
|
83
|
-
def foreign_keys_for_table(*)
|
84
|
-
foreign_keys
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def foreign_key(*args) # (column_names, to_table, primary_key=nil, options=nil)
|
89
|
-
options = args.extract_options!
|
90
|
-
case args.length
|
91
|
-
when 1
|
92
|
-
to_table = args[0]
|
93
|
-
column_names = "#{to_table.to_s.singularize}_id"
|
94
|
-
when 2
|
95
|
-
column_names, to_table = args
|
96
|
-
when 3
|
97
|
-
ActiveSupport::Deprecation.warn "positional arg for foreign primary key is deprecated, use :primary_key option instead"
|
98
|
-
column_names, to_table, primary_key = args
|
99
|
-
options.merge!(:primary_key => primary_key)
|
100
|
-
else
|
101
|
-
raise ArgumentError, "wrong number of arguments (#{args.length}) for foreign_key(column_names, table_name, options)"
|
102
|
-
end
|
103
|
-
|
104
|
-
options.merge!(:column => column_names)
|
105
|
-
options.reverse_merge!(:name => ForeignKeyDefinition.default_name(self.name, column_names))
|
106
|
-
fk = ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(self.name, AbstractAdapter.proper_table_name(to_table), options)
|
107
|
-
foreign_keys_for_table(fk.to_table) << fk
|
108
|
-
self
|
109
|
-
end
|
110
|
-
|
111
72
|
end
|
112
73
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module ActiveRecord
|
3
5
|
module Migration
|
@@ -6,7 +8,7 @@ module SchemaPlus::ForeignKeys
|
|
6
8
|
attr_accessor :schema_plus_foreign_keys_config #:nodoc:
|
7
9
|
|
8
10
|
# seems like this is fixing a rails bug:
|
9
|
-
# change_table foo, :
|
11
|
+
# change_table foo, bulk: true { |t| t.references :bar }
|
10
12
|
# results in an 'unknown method :add_reference_sql' (with mysql2)
|
11
13
|
#
|
12
14
|
# should track it down separately and submit a patch/fix to rails
|
@@ -16,7 +18,7 @@ module SchemaPlus::ForeignKeys
|
|
16
18
|
options[:references] = nil if polymorphic
|
17
19
|
# ugh. copying and pasting code from ::ActiveRecord::ConnectionAdapters::SchemaStatements#add_reference
|
18
20
|
index_options = options.delete(:index)
|
19
|
-
add_column(table_name, "#{ref_name}_id", :integer, options)
|
21
|
+
add_column(table_name, "#{ref_name}_id", :integer, **options)
|
20
22
|
add_column(table_name, "#{ref_name}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) if polymorphic
|
21
23
|
add_index(table_name, polymorphic ? %w[id type].map{ |t| "#{ref_name}_#{t}" } : "#{ref_name}_id", index_options.is_a?(Hash) ? index_options : {}) if index_options
|
22
24
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module Middleware
|
3
5
|
module Dumper
|
@@ -37,7 +39,7 @@ module SchemaPlus::ForeignKeys
|
|
37
39
|
|
38
40
|
# Ignore the foreign key dumps at the end of the schema; we'll put them in/near their tables
|
39
41
|
def after(env)
|
40
|
-
env.dump.final.reject!
|
42
|
+
env.dump.final.reject!{ |it| it =~/foreign_key/ }
|
41
43
|
end
|
42
44
|
|
43
45
|
private
|
@@ -66,7 +68,7 @@ module SchemaPlus::ForeignKeys
|
|
66
68
|
def after(env)
|
67
69
|
dumped = {}
|
68
70
|
env.table.columns.each do |column|
|
69
|
-
if (foreign_key = env.dump.data.inline_fks[env.table.name].find
|
71
|
+
if (foreign_key = env.dump.data.inline_fks[env.table.name].find { |it| it.column.to_s == column.name })
|
70
72
|
column.options[:foreign_key] = {references: foreign_key.to_table}.merge foreign_key.options_for_dump
|
71
73
|
dumped[foreign_key] = true
|
72
74
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module Middleware
|
3
5
|
module Migration
|
@@ -22,7 +24,13 @@ module SchemaPlus::ForeignKeys
|
|
22
24
|
env.connection.foreign_keys(newname).each do |fk|
|
23
25
|
begin
|
24
26
|
env.connection.remove_foreign_key(newname, name: fk.name)
|
25
|
-
env.connection.add_foreign_key(newname, fk.to_table,
|
27
|
+
env.connection.add_foreign_key(newname, fk.to_table,
|
28
|
+
column: fk.column,
|
29
|
+
primary_key: fk.primary_key,
|
30
|
+
name: fk.name.sub(/#{oldname}/, newname),
|
31
|
+
on_update: fk.on_update,
|
32
|
+
on_delete: fk.on_delete,
|
33
|
+
deferrable: fk.deferrable)
|
26
34
|
rescue NotImplementedError
|
27
35
|
# sqlite3 can't remote or add foreign keys, so just skip it
|
28
36
|
end
|
@@ -123,9 +131,9 @@ module SchemaPlus::ForeignKeys
|
|
123
131
|
references = fk_opts.delete(:references)
|
124
132
|
case env.caller
|
125
133
|
when ::ActiveRecord::ConnectionAdapters::TableDefinition
|
126
|
-
env.caller.foreign_key(
|
134
|
+
env.caller.foreign_key(references, **fk_opts)
|
127
135
|
else
|
128
|
-
env.caller.add_foreign_key(env.table_name, references, fk_opts
|
136
|
+
env.caller.add_foreign_key(env.table_name, references, **fk_opts)
|
129
137
|
end
|
130
138
|
end
|
131
139
|
|
@@ -134,6 +142,7 @@ module SchemaPlus::ForeignKeys
|
|
134
142
|
return nil if opts.nil?
|
135
143
|
return :none if opts == false
|
136
144
|
opts = {} if opts == true
|
145
|
+
opts[:column] ||= env.column_name
|
137
146
|
opts[:references] ||= default_table_name(env)
|
138
147
|
opts[:on_update] ||= config.on_update
|
139
148
|
opts[:on_delete] ||= config.on_delete
|
@@ -141,7 +150,7 @@ module SchemaPlus::ForeignKeys
|
|
141
150
|
end
|
142
151
|
|
143
152
|
def remove_foreign_key_if_exists(env)
|
144
|
-
env.caller.remove_foreign_key(env.table_name.to_s, column: env.column_name.to_s, :
|
153
|
+
env.caller.remove_foreign_key(env.table_name.to_s, column: env.column_name.to_s, if_exists: true)
|
145
154
|
end
|
146
155
|
|
147
156
|
def default_table_name(env)
|
@@ -159,4 +168,3 @@ module SchemaPlus::ForeignKeys
|
|
159
168
|
end
|
160
169
|
end
|
161
170
|
end
|
162
|
-
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module Middleware
|
3
5
|
|
@@ -6,7 +8,7 @@ module SchemaPlus::ForeignKeys
|
|
6
8
|
module DropTable
|
7
9
|
|
8
10
|
def around(env)
|
9
|
-
if
|
11
|
+
if env.options[:force] == :cascade
|
10
12
|
env.connection.reverse_foreign_keys(env.table_name).each do |foreign_key|
|
11
13
|
env.connection.remove_foreign_key(foreign_key.from_table, name: foreign_key.name)
|
12
14
|
end
|
@@ -1,23 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::ForeignKeys
|
2
4
|
module Middleware
|
3
5
|
module Sql
|
4
6
|
module Table
|
5
|
-
if Gem::Requirement.new('< 5.0').satisfied_by?(::ActiveRecord.version)
|
6
|
-
def after(env)
|
7
|
-
foreign_keys = if env.table_definition.foreign_keys.is_a? Array
|
8
|
-
env.table_definition.foreign_keys
|
9
|
-
else
|
10
|
-
env.table_definition.foreign_keys.values.tap { |v| v.flatten! }
|
11
|
-
end
|
12
|
-
|
13
|
-
# create foreign key constraints inline in table definition
|
14
|
-
env.sql.body = ([env.sql.body] + foreign_keys.map(&:to_sql)).join(', ')
|
15
|
-
|
16
|
-
# prevents AR >= 4.2.1 from emitting add_foreign_key after the table
|
17
|
-
env.table_definition.foreign_keys.clear
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
7
|
module SQLite3
|
22
8
|
def before(env)
|
23
9
|
env.connection.execute('PRAGMA FOREIGN_KEYS = ON') if env.table_definition.foreign_keys.any?
|
data/schema_dev.yml
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
lib = File.expand_path('../lib', __FILE__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
6
|
require 'schema_plus/foreign_keys/version'
|
@@ -18,16 +20,15 @@ Gem::Specification.new do |gem|
|
|
18
20
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
21
|
gem.require_paths = ["lib"]
|
20
22
|
|
21
|
-
gem.
|
22
|
-
|
23
|
-
gem.add_dependency "
|
23
|
+
gem.required_ruby_version = ">= 2.5.0"
|
24
|
+
|
25
|
+
gem.add_dependency "activerecord", ">= 5.2", "< 6.1"
|
26
|
+
gem.add_dependency "schema_plus_core", "~> 3.0.0"
|
27
|
+
gem.add_dependency "schema_plus_compatibility", "~> 1.0.0"
|
24
28
|
gem.add_dependency "valuable"
|
25
|
-
gem.add_dependency "its-it", "~> 1.2"
|
26
29
|
|
27
|
-
gem.add_development_dependency "bundler"
|
28
|
-
gem.add_development_dependency "rake", "~>
|
30
|
+
gem.add_development_dependency "bundler"
|
31
|
+
gem.add_development_dependency "rake", "~> 13.0"
|
29
32
|
gem.add_development_dependency "rspec", "~> 3.0"
|
30
|
-
gem.add_development_dependency "schema_dev", "~>
|
31
|
-
gem.add_development_dependency "simplecov"
|
32
|
-
gem.add_development_dependency "simplecov-gem-profile"
|
33
|
+
gem.add_development_dependency "schema_dev", "~> 4.1"
|
33
34
|
end
|
data/spec/deprecation_spec.rb
CHANGED
@@ -1,89 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe 'Deprecations' do
|
4
6
|
|
5
7
|
let(:migration) { ActiveRecord::Migration }
|
6
8
|
|
7
|
-
describe "on add_foreign_key", sqlite3: :skip do
|
8
|
-
before(:each) do
|
9
|
-
define_schema do
|
10
|
-
create_table :posts
|
11
|
-
create_table :comments do |t|
|
12
|
-
t.references :post
|
13
|
-
end
|
14
|
-
end
|
15
|
-
class Comment < ::ActiveRecord::Base ; end
|
16
|
-
end
|
17
|
-
|
18
|
-
it "deprecates 4-argument form" do
|
19
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/4-argument/)
|
20
|
-
migration.add_foreign_key "comments", "post_id", "posts", "id"
|
21
|
-
expect(Comment).to reference(:posts, :id).on(:post_id)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "on remove_foreign_key", sqlite3: :skip do
|
27
|
-
before(:each) do
|
28
|
-
define_schema do
|
29
|
-
create_table :posts
|
30
|
-
create_table :comments do |t|
|
31
|
-
t.references :post, foreign_key: true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
class Comment < ::ActiveRecord::Base ; end
|
35
|
-
end
|
36
|
-
|
37
|
-
it "deprecates :column_names option" do
|
38
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/column_names/)
|
39
|
-
migration.remove_foreign_key "comments", "posts", column_names: "post_id"
|
40
|
-
Comment.reset_column_information
|
41
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "deprecates :references_column_names option" do
|
45
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/references_column_names.*primary_key/)
|
46
|
-
migration.remove_foreign_key "comments", "posts", references_column_names: "id"
|
47
|
-
Comment.reset_column_information
|
48
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "deprecates :references_table_name option" do
|
52
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/references_table_name.*to_table/)
|
53
|
-
migration.remove_foreign_key "comments", references_table_name: "posts"
|
54
|
-
Comment.reset_column_information
|
55
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "deprecates table-and-name form" do
|
59
|
-
Comment.reset_column_information
|
60
|
-
name = Comment.foreign_keys.first.name
|
61
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/name.*name: name/)
|
62
|
-
migration.remove_foreign_key "comments", name
|
63
|
-
Comment.reset_column_information
|
64
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "deprecates 3-argument form" do
|
68
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/3.*-argument/)
|
69
|
-
migration.remove_foreign_key "comments", "post_id", "posts"
|
70
|
-
Comment.reset_column_information
|
71
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "deprecates 4-argument form" do
|
75
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/4.*-argument/)
|
76
|
-
migration.remove_foreign_key "comments", "post_id", "posts", "id"
|
77
|
-
Comment.reset_column_information
|
78
|
-
expect(Comment).to_not reference(:posts, :id).on(:post_id)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "raises error for 5 arguments" do
|
82
|
-
expect { migration.remove_foreign_key "zip", "a", "dee", "do", "da" }.to raise_error /Wrong number of arguments.*5/
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
9
|
describe "on foreign key definition" do
|
88
10
|
before(:each) do
|
89
11
|
define_schema do
|
@@ -100,26 +22,6 @@ describe 'Deprecations' do
|
|
100
22
|
Comment.foreign_keys.first
|
101
23
|
}
|
102
24
|
|
103
|
-
it "deprecates column_names" do
|
104
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/column_names/)
|
105
|
-
expect(definition.column_names).to eq(["post_id"])
|
106
|
-
end
|
107
|
-
|
108
|
-
it "deprecates references_column_names" do
|
109
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/references_column_names.*primary_key/)
|
110
|
-
expect(definition.references_column_names).to eq(["id"])
|
111
|
-
end
|
112
|
-
|
113
|
-
it "deprecates references_table_name" do
|
114
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/references_table_name.*to_table/)
|
115
|
-
expect(definition.references_table_name).to eq("posts")
|
116
|
-
end
|
117
|
-
|
118
|
-
it "deprecates table_name" do
|
119
|
-
expect(ActiveSupport::Deprecation).to receive(:warn).with(/table_name.*from_table/)
|
120
|
-
expect(definition.table_name).to eq("comments")
|
121
|
-
end
|
122
|
-
|
123
25
|
it "deprecates :set_null" do
|
124
26
|
expect(ActiveSupport::Deprecation).to receive(:warn).with(/set_null.*nullify/)
|
125
27
|
allow(ActiveSupport::Deprecation).to receive(:warn).with(/table_exists\? currently checks/)
|
@@ -135,17 +37,16 @@ describe 'Deprecations' do
|
|
135
37
|
end
|
136
38
|
|
137
39
|
describe "in table definition" do
|
138
|
-
it "
|
139
|
-
expect
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
40
|
+
it "raises error for 3 arguments" do
|
41
|
+
expect {
|
42
|
+
define_schema do
|
43
|
+
create_table :posts, primary_key: :funky
|
44
|
+
create_table :comments do |t|
|
45
|
+
t.references :post
|
46
|
+
t.foreign_key :post_id, :posts, :funky
|
47
|
+
end
|
146
48
|
end
|
147
|
-
|
148
|
-
expect(migration.foreign_keys("comments").first.primary_key).to eq("funky")
|
49
|
+
}.to raise_error /wrong number of arguments/i
|
149
50
|
end
|
150
51
|
|
151
52
|
it "raises error for 4 arguments" do
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe "Foreign Key definition" do
|
4
6
|
|
5
7
|
let(:definition) {
|
6
|
-
options = {:
|
8
|
+
options = {name: "posts_user_fkey", column: :user, primary_key: :id}
|
7
9
|
::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(:posts, :users, options)
|
8
10
|
}
|
9
11
|
|
@@ -12,13 +14,13 @@ describe "Foreign Key definition" do
|
|
12
14
|
end
|
13
15
|
|
14
16
|
it "dumps to sql with deferrable values" do
|
15
|
-
options = {:
|
17
|
+
options = {name: "posts_user_fkey", column: :user, primary_key: :id, deferrable: true}
|
16
18
|
deferred_definition = ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(:posts, :users, options)
|
17
19
|
expect(deferred_definition.to_sql).to eq(%Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE})
|
18
20
|
end
|
19
21
|
|
20
22
|
it "dumps to sql with initially deferrable values" do
|
21
|
-
options = {:
|
23
|
+
options = {name: "posts_user_fkey", column: :user, primary_key: :id, deferrable: :initially_deferred}
|
22
24
|
initially_deferred_definition = ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(:posts, :users, options)
|
23
25
|
expect(initially_deferred_definition.to_sql).to eq(%Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE INITIALLY DEFERRED})
|
24
26
|
end
|