forked from rgo/foreign_key_migrations
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME
91 lines (65 loc) · 3.06 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
= Foreign Key Migrations
Foreign Key Migrations is a plugin that automatically generates foreign-key
constraints when creating tables. It uses SQL-92 syntax and as such should be
compatible with most databases that support foreign-key constraints.
In the simplest case, the plugin assumes that if you have a column named
+customer_id+ that you want a foreign-key constraint generated that references
the +id+ column in the +customers+ table:
create_table :orders do |t|
t.column :customer_id, :integer, :null => false
...
end
If you have multiple columns referencing a table or for whatever reason, your
column name isn't the same as the referenced table name, you can use the
<code>:references</code> option:
create_table :orders do |t|
t.column :ordered_by_id, :integer, :null => false, :references => :customers
...
end
If you have a column with a name ending in +_id+ for which you do not wish a
foreign-key to be generated, you can use <code>:references => nil</code>:
create_table :orders do |t|
t.column :external_id, :integer, :null => false, :references => nil
...
end
Sometimes you may (for legacy reasons) need to reference a primary key column that is
named something other than +id+. In this case you can specify the name of the column:
create_table :orders do |t|
t.column :ordered_by_pk, :integer, :null => false, :references => [:customers, :pk]
...
end
You also have the option of specifying what to do on delete/update using
<code>:on_delete</code>/<code>:on_update</code>, respectively to one of:
<code>:cascade</code>; <code>:restrict</code>; and <code>:set_null</code>:
create_table :orders do |t|
t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
...
end
If your database supports it (for example PostgreSQL) you can also mark the constraint as deferrable:
create_table :orders do |t|
t.column :customer_id, :integer, :deferrable => true
...
end
By convention, if a column is named +parent_id+ it will be treated as a circular reference to
the table in which it is defined.
Sometimes you may (for legacy reasons) need to name your primary key column such that it
would be misinterpreted as a foreign-key (say for example if you named the primary key
+order_id+). In this case you can manually create the primary key as follows:
create_table :orders, :id => false do |t|
...
t.primary_key :order_id, :references => nil
end
There is also a generator for creating foreign keys on a database that currently has none:
ruby script/generate foreign_key_migration
The plugin fully supports and understands the following active-record
configuration properties:
* <code>config.active_record.pluralize_table_names</code>
* <code>config.active_record.table_name_prefix</code>
* <code>config.active_record.table_name_suffix</code>
=== Dependencies
* RedHill on Rails Core (redhillonrails_core).
=== See Also
* Foreign Key Associations (foreign_key_associations).
=== License
This plugin is copyright 2006 by RedHill Consulting, Pty. Ltd. and is released
under the MIT license.