automatic_foreign_key 1.1.6 → 1.1.7
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/CHANGELOG +2 -0
- data/README.rdoc +49 -4
- data/Rakefile +4 -6
- data/VERSION +1 -1
- data/automatic_foreign_key.gemspec +74 -54
- data/lib/automatic_foreign_key.rb +4 -1
- data/lib/automatic_foreign_key/active_record/base.rb +2 -1
- data/lib/automatic_foreign_key/active_record/connection_adapters/schema_statements.rb +2 -1
- data/lib/automatic_foreign_key/active_record/migration.rb +18 -2
- data/lib/generators/automatic_foreign_key/migration_generator.rb +10 -10
- data/lib/generators/automatic_foreign_key/templates/migration.rb +1 -0
- data/spec/connections/mysql2/connection.rb +16 -0
- data/spec/migration_spec.rb +52 -4
- data/spec/schema/schema.rb +8 -0
- data/spec/schema_dumper_spec.rb +32 -0
- data/spec/support/matchers/reference.rb +3 -3
- metadata +114 -29
- data/.gitignore +0 -21
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -4,6 +4,21 @@ Automatic Foreign Key is an ActiveRecord extension that automatically generates
|
|
4
4
|
constraints when creating tables. It uses SQL-92 syntax and as such should be
|
5
5
|
compatible with most databases that support foreign-key constraints.
|
6
6
|
|
7
|
+
As a bonus, the extension also allows you to create indices on columns via
|
8
|
+
options to the schema column definition statements.
|
9
|
+
|
10
|
+
=== Installation
|
11
|
+
|
12
|
+
As a gem
|
13
|
+
|
14
|
+
gem install automatic_foreign_key
|
15
|
+
|
16
|
+
...or as a plugin
|
17
|
+
|
18
|
+
script/plugin install http://github.com/mlomnicki/automatic_foreign_key.git
|
19
|
+
|
20
|
+
=== Usage
|
21
|
+
|
7
22
|
In the simplest case, the plugin assumes that if you have a column named
|
8
23
|
+customer_id+ that you want a foreign-key constraint generated that references
|
9
24
|
the +id+ column in the +customers+ table:
|
@@ -99,16 +114,46 @@ If you want to pass some options for index use hash params.
|
|
99
114
|
Auto indexing option is useless for MySQL users as their RDBMS adds indices on foreign
|
100
115
|
keys by default. However PostgreSQL users may have fun with that feature.
|
101
116
|
|
117
|
+
=== Column Indices
|
118
|
+
|
119
|
+
You can create an index on any column by specifying the +:index+ option.
|
120
|
+
|
121
|
+
create_table :users do |t|
|
122
|
+
...
|
123
|
+
t.string :role, :index => true
|
124
|
+
end
|
125
|
+
|
126
|
+
If you want to pass some options for rails' +add_index()+ you can use hash params.
|
127
|
+
|
128
|
+
create_table :users do |t|
|
129
|
+
...
|
130
|
+
t.string :userid, :index => { :unique => true }
|
131
|
+
end
|
132
|
+
|
133
|
+
You can also define a multi-column index by specifying a +:with+ option
|
134
|
+
listing one or more additional columns to be passed to +add_index()+.
|
135
|
+
|
136
|
+
create_table :users do |t|
|
137
|
+
t.integer :group_id
|
138
|
+
t.integer :member_number, :index => { :with => :group_id, :unique => true }
|
139
|
+
t.integer :country_code
|
140
|
+
t.string :area_code
|
141
|
+
t.string :local_phone, :index => { :with => [:country_code, :area_code], :unique => true }
|
142
|
+
end
|
143
|
+
|
102
144
|
=== Configuration
|
103
145
|
|
104
146
|
For customization purposes create config/initializers/automatic_foreign_key.rb file:
|
105
|
-
|
106
|
-
|
107
|
-
|
147
|
+
|
148
|
+
AutomaticForeignKey.setup do |config|
|
149
|
+
config.auto_index = true # create indices on FKs by default
|
150
|
+
config.on_update = :cascade # cascade as default on_update action
|
151
|
+
config.on_delete = :restrict # restrict as default on_delete action
|
152
|
+
end
|
108
153
|
|
109
154
|
=== Rails 3 compatibility
|
110
155
|
|
111
|
-
Automatic foreign key is fully
|
156
|
+
Automatic foreign key is fully compatible with Rails 3.
|
112
157
|
|
113
158
|
=== Rails 2.x compatibility
|
114
159
|
|
data/Rakefile
CHANGED
@@ -12,8 +12,8 @@ constraints when creating tables or adding columns. It uses SQL-92 syntax and as
|
|
12
12
|
gem.email = "michal.lomnicki@gmail.com"
|
13
13
|
gem.homepage = "http://github.com/mlomnicki/automatic_foreign_key"
|
14
14
|
gem.authors = ["Michał Łomnicki"]
|
15
|
-
gem.
|
16
|
-
gem.
|
15
|
+
gem.files.exclude "Gemfile"
|
16
|
+
gem.files.exclude "Gemfile.lock"
|
17
17
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
18
|
end
|
19
19
|
Jeweler::GemcutterTasks.new
|
@@ -42,7 +42,7 @@ rescue LoadError
|
|
42
42
|
end
|
43
43
|
|
44
44
|
require 'spec/rake/spectask'
|
45
|
-
%w[postgresql mysql].each do |adapter|
|
45
|
+
%w[postgresql mysql mysql2].each do |adapter|
|
46
46
|
namespace adapter do
|
47
47
|
Spec::Rake::SpecTask.new(:spec) do |spec|
|
48
48
|
spec.libs << 'lib' << 'spec' << "spec/connections/#{adapter}"
|
@@ -53,13 +53,11 @@ end
|
|
53
53
|
|
54
54
|
desc 'Run postgresql and mysql tests'
|
55
55
|
task :spec do
|
56
|
-
%w[postgresql mysql].each do |adapter|
|
56
|
+
%w[postgresql mysql mysql2].each do |adapter|
|
57
57
|
Rake::Task["#{adapter}:spec"].invoke
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
task :spec => :check_dependencies
|
62
|
-
|
63
61
|
task :default => :spec
|
64
62
|
|
65
63
|
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.7
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{automatic_foreign_key}
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["
|
12
|
-
s.date = %q{
|
11
|
+
s.authors = ["Michał Łomnicki"]
|
12
|
+
s.date = %q{2011-01-10}
|
13
13
|
s.description = %q{Automatic Foreign Key automatically generates foreign-key
|
14
14
|
constraints when creating tables or adding columns. It uses SQL-92 syntax and as such should be compatible with most databases that support foreign-key constraints.}
|
15
15
|
s.email = %q{michal.lomnicki@gmail.com}
|
@@ -18,71 +18,91 @@ constraints when creating tables or adding columns. It uses SQL-92 syntax and as
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
21
|
+
"CHANGELOG",
|
22
|
+
"MIT-LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"automatic_foreign_key.gemspec",
|
27
|
+
"init.rb",
|
28
|
+
"install.rb",
|
29
|
+
"lib/automatic_foreign_key.rb",
|
30
|
+
"lib/automatic_foreign_key/active_record/base.rb",
|
31
|
+
"lib/automatic_foreign_key/active_record/connection_adapters/schema_statements.rb",
|
32
|
+
"lib/automatic_foreign_key/active_record/connection_adapters/table_definition.rb",
|
33
|
+
"lib/automatic_foreign_key/active_record/migration.rb",
|
34
|
+
"lib/generators/automatic_foreign_key/migration_generator.rb",
|
35
|
+
"lib/generators/automatic_foreign_key/templates/migration.rb",
|
36
|
+
"spec/aaa_create_tables_spec.rb",
|
37
|
+
"spec/connections/mysql/connection.rb",
|
38
|
+
"spec/connections/mysql2/connection.rb",
|
39
|
+
"spec/connections/postgresql/connection.rb",
|
40
|
+
"spec/migration_spec.rb",
|
41
|
+
"spec/models/comment.rb",
|
42
|
+
"spec/models/post.rb",
|
43
|
+
"spec/models/user.rb",
|
44
|
+
"spec/references_spec.rb",
|
45
|
+
"spec/schema/schema.rb",
|
46
|
+
"spec/schema_dumper_spec.rb",
|
47
|
+
"spec/spec_helper.rb",
|
48
|
+
"spec/support/matchers/automatic_foreign_key_matchers.rb",
|
49
|
+
"spec/support/matchers/have_index.rb",
|
50
|
+
"spec/support/matchers/reference.rb"
|
50
51
|
]
|
51
52
|
s.homepage = %q{http://github.com/mlomnicki/automatic_foreign_key}
|
52
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
53
53
|
s.require_paths = ["lib"]
|
54
|
-
s.rubygems_version = %q{1.3.
|
54
|
+
s.rubygems_version = %q{1.3.7}
|
55
55
|
s.summary = %q{Automatically generate foreign-key constraints when creating tables}
|
56
56
|
s.test_files = [
|
57
|
+
"spec/aaa_create_tables_spec.rb",
|
58
|
+
"spec/connections/mysql/connection.rb",
|
59
|
+
"spec/connections/mysql2/connection.rb",
|
60
|
+
"spec/connections/postgresql/connection.rb",
|
61
|
+
"spec/migration_spec.rb",
|
62
|
+
"spec/models/comment.rb",
|
63
|
+
"spec/models/post.rb",
|
64
|
+
"spec/models/user.rb",
|
65
|
+
"spec/references_spec.rb",
|
57
66
|
"spec/schema/schema.rb",
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
"spec/support/matchers/reference.rb",
|
64
|
-
"spec/spec_helper.rb",
|
65
|
-
"spec/references_spec.rb",
|
66
|
-
"spec/migration_spec.rb",
|
67
|
-
"spec/models/user.rb",
|
68
|
-
"spec/models/post.rb",
|
69
|
-
"spec/models/comment.rb"
|
67
|
+
"spec/schema_dumper_spec.rb",
|
68
|
+
"spec/spec_helper.rb",
|
69
|
+
"spec/support/matchers/automatic_foreign_key_matchers.rb",
|
70
|
+
"spec/support/matchers/have_index.rb",
|
71
|
+
"spec/support/matchers/reference.rb"
|
70
72
|
]
|
71
73
|
|
72
74
|
if s.respond_to? :specification_version then
|
73
75
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
74
76
|
s.specification_version = 3
|
75
77
|
|
76
|
-
if Gem::Version.new(Gem::
|
77
|
-
s.add_runtime_dependency(%q<
|
78
|
-
s.add_runtime_dependency(%q<
|
78
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
79
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
80
|
+
s.add_runtime_dependency(%q<redhillonrails_core>, ["~> 1.1.1"])
|
81
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5"])
|
82
|
+
s.add_development_dependency(%q<rspec>, ["~> 1.3"])
|
83
|
+
s.add_development_dependency(%q<railties>, [">= 0"])
|
84
|
+
s.add_development_dependency(%q<pg>, [">= 0"])
|
85
|
+
s.add_development_dependency(%q<mysql>, [">= 0"])
|
86
|
+
s.add_development_dependency(%q<mysql2>, [">= 0"])
|
79
87
|
else
|
80
|
-
s.add_dependency(%q<
|
81
|
-
s.add_dependency(%q<
|
88
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
89
|
+
s.add_dependency(%q<redhillonrails_core>, ["~> 1.1.1"])
|
90
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5"])
|
91
|
+
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
92
|
+
s.add_dependency(%q<railties>, [">= 0"])
|
93
|
+
s.add_dependency(%q<pg>, [">= 0"])
|
94
|
+
s.add_dependency(%q<mysql>, [">= 0"])
|
95
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
82
96
|
end
|
83
97
|
else
|
84
|
-
s.add_dependency(%q<
|
85
|
-
s.add_dependency(%q<
|
98
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
99
|
+
s.add_dependency(%q<redhillonrails_core>, ["~> 1.1.1"])
|
100
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5"])
|
101
|
+
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
102
|
+
s.add_dependency(%q<railties>, [">= 0"])
|
103
|
+
s.add_dependency(%q<pg>, [">= 0"])
|
104
|
+
s.add_dependency(%q<mysql>, [">= 0"])
|
105
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
86
106
|
end
|
87
107
|
end
|
88
108
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
begin
|
2
|
-
require 'active_support'
|
3
2
|
require 'redhillonrails_core'
|
4
3
|
rescue
|
5
4
|
gem 'redhillonrails_core'
|
@@ -28,6 +27,10 @@ module AutomaticForeignKey
|
|
28
27
|
mattr_accessor :auto_index
|
29
28
|
@@auto_index = nil
|
30
29
|
|
30
|
+
def self.setup(&block)
|
31
|
+
yield self
|
32
|
+
end
|
33
|
+
|
31
34
|
def self.options_for_index(index)
|
32
35
|
index.is_a?(Hash) ? index : {}
|
33
36
|
end
|
@@ -28,7 +28,8 @@ module AutomaticForeignKey::ActiveRecord
|
|
28
28
|
elsif column_name == 'parent_id'
|
29
29
|
[table_name, :id]
|
30
30
|
elsif column_name =~ /^(.*)_id$/
|
31
|
-
|
31
|
+
determined_table_name = ActiveRecord::Base.pluralize_table_names ? $1.to_s.pluralize : $1
|
32
|
+
[determined_table_name, :id]
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
@@ -14,7 +14,8 @@ module AutomaticForeignKey::ActiveRecord::ConnectionAdapters
|
|
14
14
|
indices = table_definition.indices
|
15
15
|
end
|
16
16
|
indices.each do |column_name, index_options|
|
17
|
-
|
17
|
+
column_names = [column_name] + Array.wrap(index_options.delete(:with))
|
18
|
+
add_index(table, column_names, index_options)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
@@ -5,8 +5,7 @@ module AutomaticForeignKey::ActiveRecord
|
|
5
5
|
end
|
6
6
|
|
7
7
|
module ClassMethods
|
8
|
-
# Overrides
|
9
|
-
# foreign key if column references other column
|
8
|
+
# Overrides ActiveRecord#add_column and adds foreign key if column references other column
|
10
9
|
#
|
11
10
|
# add_column('comments', 'post_id', :integer)
|
12
11
|
# # creates a column and adds foreign key on posts(id)
|
@@ -30,6 +29,17 @@ module AutomaticForeignKey::ActiveRecord
|
|
30
29
|
#
|
31
30
|
def add_column(table_name, column_name, type, options = {})
|
32
31
|
super
|
32
|
+
handle_column_options(table_name, column_name, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
def change_column(table_name, column_name, type, options = {})
|
36
|
+
super
|
37
|
+
remove_foreign_key_if_exists(table_name, column_name)
|
38
|
+
handle_column_options(table_name, column_name, options)
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def handle_column_options(table_name, column_name, options)
|
33
43
|
references = ActiveRecord::Base.references(table_name, column_name, options)
|
34
44
|
if references
|
35
45
|
AutomaticForeignKey.set_default_update_and_delete_actions!(options)
|
@@ -42,6 +52,12 @@ module AutomaticForeignKey::ActiveRecord
|
|
42
52
|
end
|
43
53
|
end
|
44
54
|
|
55
|
+
def remove_foreign_key_if_exists(table_name, column_name)
|
56
|
+
foreign_keys = ActiveRecord::Base.connection.foreign_keys(table_name.to_s)
|
57
|
+
fk = foreign_keys.detect { |fk| fk.table_name == table_name.to_s && fk.column_names == Array(column_name).collect(&:to_s) }
|
58
|
+
remove_foreign_key(table_name, fk.name) if fk
|
59
|
+
end
|
60
|
+
|
45
61
|
end
|
46
62
|
end
|
47
63
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'generators
|
2
|
-
require 'active_record'
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/active_record'
|
3
3
|
|
4
4
|
module AutomaticForeignKey
|
5
5
|
class MigrationGenerator < ::ActiveRecord::Generators::Base
|
6
|
-
argument :name, :default => '
|
6
|
+
argument :name, :default => 'create_foreign_keys'
|
7
7
|
|
8
8
|
def self.source_root
|
9
9
|
File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
@@ -22,15 +22,15 @@ module AutomaticForeignKey
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def determine_foreign_keys
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
25
|
+
foreign_keys = []
|
26
|
+
connection = ::ActiveRecord::Base.connection
|
27
|
+
connection.tables.each do |table_name|
|
28
|
+
connection.columns(table_name).each do |column|
|
29
|
+
references = ::ActiveRecord::Base.references(table_name, column.name)
|
30
|
+
foreign_keys << ::RedhillonrailsCore::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(nil, table_name, column.name, references.first, references.last) if references
|
32
31
|
end
|
33
32
|
end
|
33
|
+
foreign_keys
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
print "Using MySQL2\n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
ActiveRecord::Base.configurations = {
|
5
|
+
'afk' => {
|
6
|
+
:adapter => 'mysql2',
|
7
|
+
:database => 'afk_unittest',
|
8
|
+
:username => 'afk',
|
9
|
+
:encoding => 'utf8',
|
10
|
+
:socket => '/var/run/mysqld/mysqld.sock',
|
11
|
+
:min_messages => 'warning'
|
12
|
+
}
|
13
|
+
|
14
|
+
}
|
15
|
+
|
16
|
+
ActiveRecord::Base.establish_connection 'afk'
|
data/spec/migration_spec.rb
CHANGED
@@ -15,10 +15,10 @@ end
|
|
15
15
|
describe ActiveRecord::Migration do
|
16
16
|
|
17
17
|
context "when table is created" do
|
18
|
-
|
18
|
+
|
19
|
+
before(:each) do
|
19
20
|
@model = Post
|
20
21
|
end
|
21
|
-
|
22
22
|
|
23
23
|
it "should create foreign keys" do
|
24
24
|
create_table(@model, :user_id => {},
|
@@ -47,6 +47,12 @@ describe ActiveRecord::Migration do
|
|
47
47
|
create_table(@model, :state => { :index => true })
|
48
48
|
@model.should have_index.on(:state)
|
49
49
|
end
|
50
|
+
|
51
|
+
it "should create a multiple-column index if specified" do
|
52
|
+
create_table(@model, :city => {},
|
53
|
+
:state => { :index => {:with => :city} } )
|
54
|
+
@model.should have_index.on([:state, :city])
|
55
|
+
end
|
50
56
|
|
51
57
|
it "should auto-index foreign keys only" do
|
52
58
|
AutomaticForeignKey.auto_index = true
|
@@ -63,7 +69,7 @@ describe ActiveRecord::Migration do
|
|
63
69
|
|
64
70
|
context "when column is added" do
|
65
71
|
|
66
|
-
before(:
|
72
|
+
before(:each) do
|
67
73
|
@model = Comment
|
68
74
|
end
|
69
75
|
|
@@ -187,6 +193,48 @@ describe ActiveRecord::Migration do
|
|
187
193
|
end
|
188
194
|
|
189
195
|
end
|
196
|
+
|
197
|
+
context "when column is changed" do
|
198
|
+
|
199
|
+
before(:each) do
|
200
|
+
@model = Comment
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should create foreign key" do
|
204
|
+
change_column :user, :string, :references => [:users, :login]
|
205
|
+
@model.should reference(:users, :login).on(:user)
|
206
|
+
change_column :user, :string, :references => nil
|
207
|
+
end
|
208
|
+
|
209
|
+
context "and initially references to users table" do
|
210
|
+
|
211
|
+
it "should have foreign key" do
|
212
|
+
@model.should reference(:users)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should drop foreign key afterwards" do
|
216
|
+
change_column :user_id, :integer, :references => :members
|
217
|
+
@model.should_not reference(:users)
|
218
|
+
change_column :user_id, :integer, :references => :users
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should reference pointed table afterwards" do
|
222
|
+
change_column :user_id, :integer, :references => :members
|
223
|
+
@model.should reference(:members)
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
protected
|
229
|
+
def change_column(column_name, *args)
|
230
|
+
table = @model.table_name
|
231
|
+
ActiveRecord::Migration.suppress_messages do
|
232
|
+
ActiveRecord::Migration.change_column(table, column_name, *args)
|
233
|
+
@model.reset_column_information
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
190
238
|
|
191
239
|
def foreign_key(model, column)
|
192
240
|
columns = Array(column).collect(&:to_s)
|
@@ -194,7 +242,7 @@ describe ActiveRecord::Migration do
|
|
194
242
|
end
|
195
243
|
|
196
244
|
def mysql?
|
197
|
-
ActiveRecord::Base.connection.adapter_name
|
245
|
+
ActiveRecord::Base.connection.adapter_name =~ /^mysql/i
|
198
246
|
end
|
199
247
|
|
200
248
|
def create_table(model, columns_with_options)
|
data/spec/schema/schema.rb
CHANGED
@@ -4,11 +4,19 @@ ActiveRecord::Schema.define do
|
|
4
4
|
t.string :login
|
5
5
|
end
|
6
6
|
add_index :users, :login, :unique => true
|
7
|
+
|
8
|
+
create_table :members, :force => true do |t|
|
9
|
+
t.string :login
|
10
|
+
end
|
7
11
|
|
8
12
|
create_table :comments, :force => true do |t|
|
9
13
|
t.string :content
|
14
|
+
t.integer :user
|
15
|
+
t.integer :user_id
|
10
16
|
end
|
11
17
|
|
18
|
+
add_foreign_key :comments, :user_id, :users, :id
|
19
|
+
|
12
20
|
create_table :posts, :force => true do |t|
|
13
21
|
t.string :content
|
14
22
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
require 'models/post'
|
5
|
+
|
6
|
+
describe "Schema dump" do
|
7
|
+
|
8
|
+
let(:dump) do
|
9
|
+
stream = StringIO.new
|
10
|
+
ActiveRecord::SchemaDumper.ignore_tables = []
|
11
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
12
|
+
stream.string
|
13
|
+
end
|
14
|
+
|
15
|
+
it "shouldn't include :index option for index" do
|
16
|
+
add_column(:author_id, :integer, :references => :users, :index => true) do
|
17
|
+
dump.should_not match(/index => true/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
def add_column(column_name, *args)
|
23
|
+
table = Post.table_name
|
24
|
+
ActiveRecord::Migration.suppress_messages do
|
25
|
+
ActiveRecord::Migration.add_column(table, column_name, *args)
|
26
|
+
Post.reset_column_information
|
27
|
+
yield if block_given?
|
28
|
+
ActiveRecord::Migration.remove_column(table, column_name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -14,7 +14,7 @@ module AutomaticForeignKeyMatchers
|
|
14
14
|
if @references_table_name
|
15
15
|
@result = @model.foreign_keys.select do |fk|
|
16
16
|
fk.references_table_name == @references_table_name &&
|
17
|
-
fk.references_column_names == @references_column_names
|
17
|
+
@references_column_names.empty? ? true : fk.references_column_names == @references_column_names
|
18
18
|
end
|
19
19
|
else
|
20
20
|
@result = @model.foreign_keys
|
@@ -26,7 +26,7 @@ module AutomaticForeignKeyMatchers
|
|
26
26
|
(@on_delete ? fk.on_delete == @on_delete : true)
|
27
27
|
end
|
28
28
|
else
|
29
|
-
|
29
|
+
!@result.empty?
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -34,7 +34,7 @@ module AutomaticForeignKeyMatchers
|
|
34
34
|
target_column_names = @column_names.present? ? "(#{@column_names.join(', ')})" : ""
|
35
35
|
destinantion_column_names = @references_table_name ? "#{@references_table_name}(#{@references_column_names.join(', ')})" : "anything"
|
36
36
|
invert = should_not ? 'not' : ''
|
37
|
-
"Expected #{@model.table_name}#{target_column_names} #{invert}
|
37
|
+
"Expected #{@model.table_name}#{target_column_names} to #{invert} reference #{destinantion_column_names}"
|
38
38
|
end
|
39
39
|
|
40
40
|
def failure_message_for_should_not
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 7
|
9
|
+
version: 1.1.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "Micha\xC5\x82 \xC5\x81omnicki"
|
@@ -14,37 +14,117 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-10 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
22
|
-
prerelease: false
|
21
|
+
name: activerecord
|
23
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
|
-
- 1
|
29
28
|
- 0
|
30
|
-
|
31
|
-
- 1
|
32
|
-
version: 1.0.4.1
|
29
|
+
version: "0"
|
33
30
|
type: :runtime
|
31
|
+
prerelease: false
|
34
32
|
version_requirements: *id001
|
35
33
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
37
|
-
prerelease: false
|
34
|
+
name: redhillonrails_core
|
38
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
39
37
|
requirements:
|
40
|
-
- -
|
38
|
+
- - ~>
|
41
39
|
- !ruby/object:Gem::Version
|
42
40
|
segments:
|
43
|
-
-
|
44
|
-
-
|
45
|
-
|
41
|
+
- 1
|
42
|
+
- 1
|
43
|
+
- 1
|
44
|
+
version: 1.1.1
|
46
45
|
type: :runtime
|
46
|
+
prerelease: false
|
47
47
|
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: jeweler
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 5
|
58
|
+
version: "1.5"
|
59
|
+
type: :development
|
60
|
+
prerelease: false
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 1
|
71
|
+
- 3
|
72
|
+
version: "1.3"
|
73
|
+
type: :development
|
74
|
+
prerelease: false
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: railties
|
78
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: *id005
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: pg
|
91
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
version: "0"
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *id006
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: mysql
|
104
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: *id007
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: mysql2
|
117
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: *id008
|
48
128
|
description: |-
|
49
129
|
Automatic Foreign Key automatically generates foreign-key
|
50
130
|
constraints when creating tables or adding columns. It uses SQL-92 syntax and as such should be compatible with most databases that support foreign-key constraints.
|
@@ -57,7 +137,6 @@ extra_rdoc_files:
|
|
57
137
|
- README.rdoc
|
58
138
|
files:
|
59
139
|
- .document
|
60
|
-
- .gitignore
|
61
140
|
- CHANGELOG
|
62
141
|
- MIT-LICENSE
|
63
142
|
- README.rdoc
|
@@ -75,6 +154,7 @@ files:
|
|
75
154
|
- lib/generators/automatic_foreign_key/templates/migration.rb
|
76
155
|
- spec/aaa_create_tables_spec.rb
|
77
156
|
- spec/connections/mysql/connection.rb
|
157
|
+
- spec/connections/mysql2/connection.rb
|
78
158
|
- spec/connections/postgresql/connection.rb
|
79
159
|
- spec/migration_spec.rb
|
80
160
|
- spec/models/comment.rb
|
@@ -82,6 +162,7 @@ files:
|
|
82
162
|
- spec/models/user.rb
|
83
163
|
- spec/references_spec.rb
|
84
164
|
- spec/schema/schema.rb
|
165
|
+
- spec/schema_dumper_spec.rb
|
85
166
|
- spec/spec_helper.rb
|
86
167
|
- spec/support/matchers/automatic_foreign_key_matchers.rb
|
87
168
|
- spec/support/matchers/have_index.rb
|
@@ -91,11 +172,12 @@ homepage: http://github.com/mlomnicki/automatic_foreign_key
|
|
91
172
|
licenses: []
|
92
173
|
|
93
174
|
post_install_message:
|
94
|
-
rdoc_options:
|
95
|
-
|
175
|
+
rdoc_options: []
|
176
|
+
|
96
177
|
require_paths:
|
97
178
|
- lib
|
98
179
|
required_ruby_version: !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
99
181
|
requirements:
|
100
182
|
- - ">="
|
101
183
|
- !ruby/object:Gem::Version
|
@@ -103,6 +185,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
185
|
- 0
|
104
186
|
version: "0"
|
105
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
|
+
none: false
|
106
189
|
requirements:
|
107
190
|
- - ">="
|
108
191
|
- !ruby/object:Gem::Version
|
@@ -112,21 +195,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
195
|
requirements: []
|
113
196
|
|
114
197
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.3.
|
198
|
+
rubygems_version: 1.3.7
|
116
199
|
signing_key:
|
117
200
|
specification_version: 3
|
118
201
|
summary: Automatically generate foreign-key constraints when creating tables
|
119
202
|
test_files:
|
120
|
-
- spec/schema/schema.rb
|
121
|
-
- spec/connections/postgresql/connection.rb
|
122
|
-
- spec/connections/mysql/connection.rb
|
123
203
|
- spec/aaa_create_tables_spec.rb
|
124
|
-
- spec/
|
125
|
-
- spec/
|
126
|
-
- spec/
|
127
|
-
- spec/spec_helper.rb
|
128
|
-
- spec/references_spec.rb
|
204
|
+
- spec/connections/mysql/connection.rb
|
205
|
+
- spec/connections/mysql2/connection.rb
|
206
|
+
- spec/connections/postgresql/connection.rb
|
129
207
|
- spec/migration_spec.rb
|
130
|
-
- spec/models/user.rb
|
131
|
-
- spec/models/post.rb
|
132
208
|
- spec/models/comment.rb
|
209
|
+
- spec/models/post.rb
|
210
|
+
- spec/models/user.rb
|
211
|
+
- spec/references_spec.rb
|
212
|
+
- spec/schema/schema.rb
|
213
|
+
- spec/schema_dumper_spec.rb
|
214
|
+
- spec/spec_helper.rb
|
215
|
+
- spec/support/matchers/automatic_foreign_key_matchers.rb
|
216
|
+
- spec/support/matchers/have_index.rb
|
217
|
+
- spec/support/matchers/reference.rb
|