Method: ActiveRecord::ConnectionAdapters::SchemaStatements#create_join_table
- Defined in:
- activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
#create_join_table(table_1, table_2, column_options: {}, **options) ⇒ Object
Creates a new join table with the name created using the lexical order of the first two arguments. These arguments can be a String or a Symbol.
# Creates a table called 'assemblies_parts' with no id.
create_join_table(:assemblies, :parts)
You can pass an options
hash which can include the following keys:
:table_name
-
Sets the table name, overriding the default.
:column_options
-
Any extra options you want appended to the columns definition.
:options
-
Any extra options you want appended to the table definition.
:temporary
-
Make a temporary table.
:force
-
Set to true to drop the table before creating it. Defaults to false.
Note that #create_join_table does not create any indices by default; you can use its block form to do so yourself:
create_join_table :products, :categories do |t|
t.index :product_id
t.index :category_id
end
Add a backend specific option to the generated SQL (MySQL)
create_join_table(:assemblies, :parts, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8')
generates:
CREATE TABLE assemblies_parts (
assembly_id bigint NOT NULL,
part_id bigint NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8
375 376 377 378 379 380 381 382 383 384 385 386 387 |
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb', line 375 def create_join_table(table_1, table_2, column_options: {}, **) join_table_name = find_join_table_name(table_1, table_2, ) .reverse_merge!(null: false, index: false) t1_ref, t2_ref = [table_1, table_2].map { |t| t.to_s.singularize } create_table(join_table_name, **.merge!(id: false)) do |td| td.references t1_ref, ** td.references t2_ref, ** yield td if block_given? end end |