1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

create_join_table should respect references column type

Follow up of #26266.

The default type of `primary_key` and `references` were changed to
`bigint` since #26266. But `create_join_table` column type is still
`integer`. It should respect `references` column type.
This commit is contained in:
Ryuta Kamizono 2017-02-28 15:34:30 +09:00
parent d50380f4e3
commit 310dc5dc44
2 changed files with 17 additions and 8 deletions

View file

@ -334,18 +334,16 @@ module ActiveRecord
# part_id int NOT NULL,
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8
#
def create_join_table(table_1, table_2, options = {})
def create_join_table(table_1, table_2, column_options: {}, **options)
join_table_name = find_join_table_name(table_1, table_2, options)
column_options = options.delete(:column_options) || {}
column_options.reverse_merge!(null: false)
type = column_options.delete(:type) || :integer
column_options.reverse_merge!(null: false, index: false)
t1_column, t2_column = [table_1, table_2].map { |t| t.to_s.singularize.foreign_key }
t1_ref, t2_ref = [table_1, table_2].map { |t| t.to_s.singularize }
create_table(join_table_name, options.merge!(id: false)) do |td|
td.send type, t1_column, column_options
td.send type, t2_column, column_options
td.references t1_ref, column_options
td.references t2_ref, column_options
yield td if block_given?
end
end

View file

@ -12,7 +12,7 @@ module ActiveRecord
teardown do
%w(artists_musics musics_videos catalog).each do |table_name|
connection.drop_table table_name if connection.table_exists?(table_name)
connection.drop_table table_name, if_exists: true
end
end
@ -78,6 +78,17 @@ module ActiveRecord
assert_equal [%w(artist_id music_id)], connection.indexes(:artists_musics).map(&:columns)
end
def test_create_join_table_respects_reference_key_type
connection.create_join_table :artists, :musics do |t|
t.references :video
end
artist_id, music_id, video_id = connection.columns(:artists_musics).sort_by(&:name)
assert_equal video_id.sql_type, artist_id.sql_type
assert_equal video_id.sql_type, music_id.sql_type
end
def test_drop_join_table
connection.create_join_table :artists, :musics
connection.drop_join_table :artists, :musics