schema_plus 0.1.2 → 0.1.3
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.
- data/.gitignore +0 -1
- data/README.rdoc +11 -8
- data/gemfiles/Gemfile.rails-2.3.lock +65 -0
- data/gemfiles/Gemfile.rails-3.0.lock +111 -0
- data/gemfiles/Gemfile.rails-3.1 +1 -1
- data/gemfiles/Gemfile.rails-3.1.lock +123 -0
- data/lib/schema_plus.rb +1 -2
- data/lib/schema_plus/active_record/base.rb +3 -10
- data/lib/schema_plus/active_record/connection_adapters/abstract_adapter.rb +11 -1
- data/lib/schema_plus/active_record/connection_adapters/column.rb +3 -2
- data/lib/schema_plus/active_record/connection_adapters/table_definition.rb +1 -1
- data/lib/schema_plus/active_record/foreign_keys.rb +177 -0
- data/lib/schema_plus/version.rb +1 -1
- data/runspecs +35 -16
- data/spec/migration_spec.rb +10 -8
- data/spec/rails3_migration_spec.rb +138 -0
- data/spec/references_spec.rb +1 -1
- data/spec/support/helpers.rb +4 -0
- metadata +102 -129
- data/lib/schema_plus/active_record/migration.rb +0 -220
data/spec/references_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
4
4
|
describe 'get_references method' do
|
5
5
|
|
6
6
|
before(:all) do
|
7
|
-
@target = ActiveRecord::Migration
|
7
|
+
@target = ActiveRecord::Migration.connection
|
8
8
|
@table_name = 'comments'
|
9
9
|
@column_name = 'post_id'
|
10
10
|
@destination_table = 'posts'
|
data/spec/support/helpers.rb
CHANGED
metadata
CHANGED
@@ -1,129 +1,126 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_plus
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Ronen Barzel
|
9
|
-
-
|
9
|
+
- Michał Łomnicki
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dependencies:
|
17
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-09-28 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
18
16
|
name: rails
|
19
|
-
|
20
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &69439930 !ruby/object:Gem::Requirement
|
21
18
|
none: false
|
22
|
-
requirements:
|
23
|
-
- -
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
26
23
|
type: :runtime
|
27
|
-
version_requirements: *id001
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: valuable
|
30
24
|
prerelease: false
|
31
|
-
|
25
|
+
version_requirements: *69439930
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: valuable
|
28
|
+
requirement: &69439700 !ruby/object:Gem::Requirement
|
32
29
|
none: false
|
33
|
-
requirements:
|
34
|
-
- -
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version:
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
37
34
|
type: :runtime
|
38
|
-
version_requirements: *id002
|
39
|
-
- !ruby/object:Gem::Dependency
|
40
|
-
name: rake
|
41
35
|
prerelease: false
|
42
|
-
|
36
|
+
version_requirements: *69439700
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
39
|
+
requirement: &69439390 !ruby/object:Gem::Requirement
|
43
40
|
none: false
|
44
|
-
requirements:
|
41
|
+
requirements:
|
45
42
|
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
47
44
|
version: 0.8.7
|
48
45
|
type: :development
|
49
|
-
version_requirements: *id003
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: rspec
|
52
46
|
prerelease: false
|
53
|
-
|
47
|
+
version_requirements: *69439390
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: &69439120 !ruby/object:Gem::Requirement
|
54
51
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version:
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
59
56
|
type: :development
|
60
|
-
version_requirements: *id004
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: pg
|
63
57
|
prerelease: false
|
64
|
-
|
58
|
+
version_requirements: *69439120
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: pg
|
61
|
+
requirement: &69438750 !ruby/object:Gem::Requirement
|
65
62
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version:
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
70
67
|
type: :development
|
71
|
-
version_requirements: *id005
|
72
|
-
- !ruby/object:Gem::Dependency
|
73
|
-
name: mysql
|
74
68
|
prerelease: false
|
75
|
-
|
69
|
+
version_requirements: *69438750
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: mysql
|
72
|
+
requirement: &69438370 !ruby/object:Gem::Requirement
|
76
73
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version:
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
81
78
|
type: :development
|
82
|
-
version_requirements: *id006
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: sqlite3
|
85
79
|
prerelease: false
|
86
|
-
|
80
|
+
version_requirements: *69438370
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: sqlite3
|
83
|
+
requirement: &69437940 !ruby/object:Gem::Requirement
|
87
84
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version:
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
92
89
|
type: :development
|
93
|
-
version_requirements: *id007
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: simplecov
|
96
90
|
prerelease: false
|
97
|
-
|
91
|
+
version_requirements: *69437940
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: simplecov
|
94
|
+
requirement: &69437700 !ruby/object:Gem::Requirement
|
98
95
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version:
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
103
100
|
type: :development
|
104
|
-
version_requirements: *id008
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: simplecov-gem-adapter
|
107
101
|
prerelease: false
|
108
|
-
|
102
|
+
version_requirements: *69437700
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: simplecov-gem-adapter
|
105
|
+
requirement: &69437420 !ruby/object:Gem::Requirement
|
109
106
|
none: false
|
110
|
-
requirements:
|
111
|
-
- -
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version:
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
114
111
|
type: :development
|
115
|
-
|
116
|
-
|
117
|
-
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: *69437420
|
114
|
+
description: ! 'SchemaPlus is an ActiveRecord extension that provides enhanced capabilities
|
115
|
+
for schema definition and querying, including: enhanced and more DRY index capabilities,
|
116
|
+
support and automation for foreign key constraints, and support for views.'
|
117
|
+
email:
|
118
118
|
- ronen@barzel.org
|
119
119
|
- michal.lomnicki@gmail.com
|
120
120
|
executables: []
|
121
|
-
|
122
121
|
extensions: []
|
123
|
-
|
124
122
|
extra_rdoc_files: []
|
125
|
-
|
126
|
-
files:
|
123
|
+
files:
|
127
124
|
- .gitignore
|
128
125
|
- .travis.yml
|
129
126
|
- Gemfile
|
@@ -131,8 +128,11 @@ files:
|
|
131
128
|
- README.rdoc
|
132
129
|
- Rakefile
|
133
130
|
- gemfiles/Gemfile.rails-2.3
|
131
|
+
- gemfiles/Gemfile.rails-2.3.lock
|
134
132
|
- gemfiles/Gemfile.rails-3.0
|
133
|
+
- gemfiles/Gemfile.rails-3.0.lock
|
135
134
|
- gemfiles/Gemfile.rails-3.1
|
135
|
+
- gemfiles/Gemfile.rails-3.1.lock
|
136
136
|
- init.rb
|
137
137
|
- lib/schema_plus.rb
|
138
138
|
- lib/schema_plus/active_record/base.rb
|
@@ -145,7 +145,7 @@ files:
|
|
145
145
|
- lib/schema_plus/active_record/connection_adapters/schema_statements.rb
|
146
146
|
- lib/schema_plus/active_record/connection_adapters/sqlite3_adapter.rb
|
147
147
|
- lib/schema_plus/active_record/connection_adapters/table_definition.rb
|
148
|
-
- lib/schema_plus/active_record/
|
148
|
+
- lib/schema_plus/active_record/foreign_keys.rb
|
149
149
|
- lib/schema_plus/active_record/schema.rb
|
150
150
|
- lib/schema_plus/active_record/schema_dumper.rb
|
151
151
|
- lib/schema_plus/railtie.rb
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- spec/models/comment.rb
|
166
166
|
- spec/models/post.rb
|
167
167
|
- spec/models/user.rb
|
168
|
+
- spec/rails3_migration_spec.rb
|
168
169
|
- spec/references_spec.rb
|
169
170
|
- spec/schema/auto_schema.rb
|
170
171
|
- spec/schema/core_schema.rb
|
@@ -177,57 +178,29 @@ files:
|
|
177
178
|
- spec/support/matchers/reference.rb
|
178
179
|
- spec/support/reference.rb
|
179
180
|
- spec/views_spec.rb
|
180
|
-
has_rdoc: true
|
181
181
|
homepage: https://github.com/lomba/schema_plus
|
182
182
|
licenses: []
|
183
|
-
|
184
183
|
post_install_message:
|
185
184
|
rdoc_options: []
|
186
|
-
|
187
|
-
require_paths:
|
185
|
+
require_paths:
|
188
186
|
- lib
|
189
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
187
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
190
188
|
none: false
|
191
|
-
requirements:
|
192
|
-
- -
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version:
|
195
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - ! '>='
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: '0'
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
194
|
none: false
|
197
|
-
requirements:
|
198
|
-
- -
|
199
|
-
- !ruby/object:Gem::Version
|
200
|
-
version:
|
195
|
+
requirements:
|
196
|
+
- - ! '>='
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
201
199
|
requirements: []
|
202
|
-
|
203
200
|
rubyforge_project: schema_plus
|
204
|
-
rubygems_version: 1.
|
201
|
+
rubygems_version: 1.8.10
|
205
202
|
signing_key:
|
206
203
|
specification_version: 3
|
207
|
-
summary: Enhances ActiveRecord schema mechanism, including more DRY index creation
|
208
|
-
|
209
|
-
|
210
|
-
- spec/connections/mysql/connection.rb
|
211
|
-
- spec/connections/mysql2/connection.rb
|
212
|
-
- spec/connections/postgresql/connection.rb
|
213
|
-
- spec/connections/sqlite3/connection.rb
|
214
|
-
- spec/foreign_key_definition_spec.rb
|
215
|
-
- spec/foreign_key_spec.rb
|
216
|
-
- spec/index_definition_spec.rb
|
217
|
-
- spec/index_spec.rb
|
218
|
-
- spec/migration_spec.rb
|
219
|
-
- spec/models/comment.rb
|
220
|
-
- spec/models/post.rb
|
221
|
-
- spec/models/user.rb
|
222
|
-
- spec/references_spec.rb
|
223
|
-
- spec/schema/auto_schema.rb
|
224
|
-
- spec/schema/core_schema.rb
|
225
|
-
- spec/schema_dumper_spec.rb
|
226
|
-
- spec/schema_spec.rb
|
227
|
-
- spec/spec_helper.rb
|
228
|
-
- spec/support/helpers.rb
|
229
|
-
- spec/support/matchers/automatic_foreign_key_matchers.rb
|
230
|
-
- spec/support/matchers/have_index.rb
|
231
|
-
- spec/support/matchers/reference.rb
|
232
|
-
- spec/support/reference.rb
|
233
|
-
- spec/views_spec.rb
|
204
|
+
summary: Enhances ActiveRecord schema mechanism, including more DRY index creation
|
205
|
+
and support for foreign key constraints and views.
|
206
|
+
test_files: []
|
@@ -1,220 +0,0 @@
|
|
1
|
-
module SchemaPlus::ActiveRecord
|
2
|
-
# SchemaPlus extends ActiveRecord::Migration with several enhancements. See documentation at Migration::ClassMethods
|
3
|
-
module Migration
|
4
|
-
def self.included(base) #:nodoc:
|
5
|
-
base.extend(ClassMethods)
|
6
|
-
end
|
7
|
-
|
8
|
-
#
|
9
|
-
# SchemaPlus extends ActiveRecord::Migration with the following enhancements.
|
10
|
-
#
|
11
|
-
module ClassMethods
|
12
|
-
|
13
|
-
# Create a new view, given its name and SQL definition
|
14
|
-
#
|
15
|
-
def create_view(view_name, definition)
|
16
|
-
connection.create_view(view_name, definition)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Drop the named view
|
20
|
-
def drop_view(view_name)
|
21
|
-
connection.drop_view(view_name)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Define a foreign key constraint. Valid options are :on_update,
|
25
|
-
# :on_delete, and :deferrable, with values as described at
|
26
|
-
# ConnectionAdapters::ForeignKeyDefinition
|
27
|
-
#
|
28
|
-
# (NOTE: Sqlite3 does not support altering a table to add foreign-key
|
29
|
-
# constraints; they must be included in the table specification when
|
30
|
-
# it's created. If you're using Sqlite3, this method will raise an
|
31
|
-
# error.)
|
32
|
-
def add_foreign_key(table_name, column_names, references_table_name, references_column_names, options = {})
|
33
|
-
connection.add_foreign_key(table_name, column_names, references_table_name, references_column_names, options)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Remove a foreign key constraint
|
37
|
-
#
|
38
|
-
# (NOTE: Sqlite3 does not support altering a table to remove
|
39
|
-
# foreign-key constraints. If you're using Sqlite3, this method will
|
40
|
-
# raise an error.)
|
41
|
-
def remove_foreign_key(table_name, foreign_key_name)
|
42
|
-
connection.remove_foreign_key(table_name, foreign_key_name)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Enhances ActiveRecord::Migration#add_column to support indexes and foreign keys, with automatic creation
|
46
|
-
#
|
47
|
-
# == Indexes
|
48
|
-
#
|
49
|
-
# The <tt>:index</tt> option takes a hash of parameters to pass to ActiveRecord::Migration.add_index. Thus
|
50
|
-
#
|
51
|
-
# add_column('books', 'isbn', :string, :index => {:name => "ISBN-index", :unique => true })
|
52
|
-
#
|
53
|
-
# is equivalent to:
|
54
|
-
#
|
55
|
-
# add_column('books', 'isbn', :string)
|
56
|
-
# add_index('books', ['isbn'], :name => "ISBN-index", :unique => true)
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# In order to support multi-column indexes, an special parameter <tt>:with</tt> may be specified, which takes another column name or an array of column names to include in the index. Thus
|
60
|
-
#
|
61
|
-
# add_column('contacts', 'phone_number', :string, :index => { :with => [:country_code, :area_code], :unique => true })
|
62
|
-
#
|
63
|
-
# is equivalent to:
|
64
|
-
#
|
65
|
-
# add_column('contacts', 'phone_number', :string)
|
66
|
-
# add_index('contacts', ['phone_number', 'country_code', 'area_code'], :unique => true)
|
67
|
-
#
|
68
|
-
#
|
69
|
-
# Some convenient shorthands are available:
|
70
|
-
#
|
71
|
-
# add_column('books', 'isbn', :index => true) # adds index with no extra options
|
72
|
-
# add_column('books', 'isbn', :index => :unique) # adds index with :unique => true
|
73
|
-
#
|
74
|
-
# == Foreign Key Constraints
|
75
|
-
#
|
76
|
-
# The +:references+ option takes the name of a table to reference in
|
77
|
-
# a foreign key constraint. For example:
|
78
|
-
#
|
79
|
-
# add_column('widgets', 'color', :integer, :references => 'colors')
|
80
|
-
#
|
81
|
-
# is equivalent to
|
82
|
-
#
|
83
|
-
# add_column('widgets', 'color', :integer)
|
84
|
-
# add_foreign_key('widgets', 'color', 'colors', 'id')
|
85
|
-
#
|
86
|
-
# The foreign column name defaults to +id+, but a different column
|
87
|
-
# can be specified using <tt>:references => [table_name,column_name]</tt>
|
88
|
-
#
|
89
|
-
# Additional options +:on_update+ and +:on_delete+ can be spcified,
|
90
|
-
# with values as described at ConnectionAdapters::ForeignKeyDefinition. For example:
|
91
|
-
#
|
92
|
-
# add_column('comments', 'post', :integer, :references => 'posts', :on_delete => :cascade)
|
93
|
-
#
|
94
|
-
# Global default values for +:on_update+ and +:on_delete+ can be
|
95
|
-
# specified in SchemaPlus.steup via, e.g., <tt>config.foreign_keys.on_update = :cascade</tt>
|
96
|
-
#
|
97
|
-
# == Automatic Foreign Key Constraints
|
98
|
-
#
|
99
|
-
# SchemaPlus supports the convention of naming foreign key columns
|
100
|
-
# with a suffix of +_id+. That is, if you define a column suffixed
|
101
|
-
# with +_id+, SchemaPlus assumes an implied :references to a table
|
102
|
-
# whose name is the column name prefix, pluralized. For example,
|
103
|
-
# these are equivalent:
|
104
|
-
#
|
105
|
-
# add_column('posts', 'author_id', :integer)
|
106
|
-
# add_column('posts', 'author_id', :integer, :references => 'authors')
|
107
|
-
#
|
108
|
-
# As a special case, if the column is named 'parent_id', SchemaPlus
|
109
|
-
# assumes it's a self reference, for a record that acts as a node of
|
110
|
-
# a tree. Thus, these are equivalent:
|
111
|
-
#
|
112
|
-
# add_column('sections', 'parent_id', :integer)
|
113
|
-
# add_column('sections', 'parent_id', :integer, :references => 'sections')
|
114
|
-
#
|
115
|
-
# If the implicit +:references+ value isn't what you want (e.g., the
|
116
|
-
# table name isn't pluralized), you can explicitly specify
|
117
|
-
# +:references+ and it will override the implicit value.
|
118
|
-
#
|
119
|
-
# If you don't want a foreign key constraint to be created, specify
|
120
|
-
# <tt>:references => nil</tt>.
|
121
|
-
# To disable automatic foreign key constraint creation globally, set
|
122
|
-
# <tt>config.foreign_keys.auto_create = false</tt> in
|
123
|
-
# SchemaPlus.steup.
|
124
|
-
#
|
125
|
-
# == Automatic Foreign Key Indexes
|
126
|
-
#
|
127
|
-
# Since efficient use of foreign key constraints requires that the
|
128
|
-
# referencing column be indexed, SchemaPlus will automatically create
|
129
|
-
# an index for the column if it created a foreign key. Thus
|
130
|
-
#
|
131
|
-
# add_column('widgets', 'color', :integer, :references => 'colors')
|
132
|
-
#
|
133
|
-
# is equivalent to:
|
134
|
-
#
|
135
|
-
# add_column('widgets', 'color', :integer, :references => 'colors', :index => true)
|
136
|
-
#
|
137
|
-
# If you want to pass options to the index, you can explcitly pass
|
138
|
-
# index options, such as <tt>:index => :unique</tt>.
|
139
|
-
#
|
140
|
-
# If you don't want an index to be created, specify
|
141
|
-
# <tt>:index => nil</tt>.
|
142
|
-
# To disable automatic foreign key index creation globally, set
|
143
|
-
# <tt>config.foreign_keys.auto_index = false</tt> in
|
144
|
-
# SchemaPlus.steup. (*Note*: If you're using MySQL, it will
|
145
|
-
# automatically create an index for foreign keys if you don't.)
|
146
|
-
#
|
147
|
-
def add_column(table_name, column_name, type, options = {})
|
148
|
-
super
|
149
|
-
handle_column_options(table_name, column_name, options)
|
150
|
-
end
|
151
|
-
|
152
|
-
# Enhances ActiveRecord::Migration#change_column to support indexes and foreign keys same as add_column.
|
153
|
-
def change_column(table_name, column_name, type, options = {})
|
154
|
-
super
|
155
|
-
remove_foreign_key_if_exists(table_name, column_name)
|
156
|
-
handle_column_options(table_name, column_name, options)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Determines referenced table and column.
|
160
|
-
# Used in migrations.
|
161
|
-
#
|
162
|
-
# If auto_create is true:
|
163
|
-
# get_references('comments', 'post_id') # => ['posts', 'id']
|
164
|
-
#
|
165
|
-
# And if <tt>column_name</tt> is parent_id it references to the same table
|
166
|
-
# get_references('pages', 'parent_id') # => ['pages', 'id']
|
167
|
-
#
|
168
|
-
# If :references option is given, it is used (whether or not auto_create is true)
|
169
|
-
# get_references('widgets', 'main_page_id', :references => 'pages'))
|
170
|
-
# # => ['pages', 'id']
|
171
|
-
#
|
172
|
-
# Also the referenced id column may be specified:
|
173
|
-
# get_references('addresses', 'member_id', :references => ['users', 'uuid'])
|
174
|
-
# # => ['users', 'uuid']
|
175
|
-
def get_references(table_name, column_name, options = {}, config=nil) #:nodoc:
|
176
|
-
column_name = column_name.to_s
|
177
|
-
if options.has_key?(:references)
|
178
|
-
references = options[:references]
|
179
|
-
references = [references, :id] unless references.nil? || references.is_a?(Array)
|
180
|
-
references
|
181
|
-
elsif (config || SchemaPlus.config).foreign_keys.auto_create? && !ActiveRecord::Schema.defining?
|
182
|
-
if column_name == 'parent_id'
|
183
|
-
[table_name, :id]
|
184
|
-
elsif column_name =~ /^(.*)_id$/
|
185
|
-
determined_table_name = ActiveRecord::Base.pluralize_table_names ? $1.to_s.pluralize : $1
|
186
|
-
[determined_table_name, :id]
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
protected
|
192
|
-
def handle_column_options(table_name, column_name, options) #:nodoc:
|
193
|
-
if references = get_references(table_name, column_name, options)
|
194
|
-
if index = options.fetch(:index, SchemaPlus.config.foreign_keys.auto_index? && !ActiveRecord::Schema.defining?)
|
195
|
-
column_index(table_name, column_name, index)
|
196
|
-
end
|
197
|
-
add_foreign_key(table_name, column_name, references.first, references.last,
|
198
|
-
options.reverse_merge(:on_update => SchemaPlus.config.foreign_keys.on_update,
|
199
|
-
:on_delete => SchemaPlus.config.foreign_keys.on_delete))
|
200
|
-
elsif options[:index]
|
201
|
-
column_index(table_name, column_name, options[:index])
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
def column_index(table_name, column_name, options) #:nodoc:
|
206
|
-
options = {} if options == true
|
207
|
-
options = { :unique => true } if options == :unique
|
208
|
-
column_name = [column_name] + Array.wrap(options.delete(:with)).compact
|
209
|
-
add_index(table_name, column_name, options)
|
210
|
-
end
|
211
|
-
|
212
|
-
def remove_foreign_key_if_exists(table_name, column_name) #:nodoc:
|
213
|
-
foreign_keys = ActiveRecord::Base.connection.foreign_keys(table_name.to_s)
|
214
|
-
fk = foreign_keys.detect { |fk| fk.table_name == table_name.to_s && fk.column_names == Array(column_name).collect(&:to_s) }
|
215
|
-
remove_foreign_key(table_name, fk.name) if fk
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|