diff options
author | Aleksey Magusev <lexmag@gmail.com> | 2012-07-19 00:24:21 +0400 |
---|---|---|
committer | Aleksey Magusev <lexmag@gmail.com> | 2012-07-19 00:24:21 +0400 |
commit | 5a7d31913bb16977ec85d55de34ac0d79b512d62 (patch) | |
tree | fe178a7dc9532832a8ec8ea992f28a29cae61320 | |
parent | fe5b943d9fd389f313dd87bf73b7c11b8746227b (diff) | |
download | rails-5a7d31913bb16977ec85d55de34ac0d79b512d62.tar.gz rails-5a7d31913bb16977ec85d55de34ac0d79b512d62.tar.bz2 rails-5a7d31913bb16977ec85d55de34ac0d79b512d62.zip |
Add fkey attributes to `join_table` migration generator
5 files changed, 24 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index a246e6ace1..a80c1cec39 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -204,11 +204,11 @@ module ActiveRecord join_table_name = find_join_table_name(table_1, table_2, options) column_options = options.delete(:column_options) || {} - column_options.reverse_merge!({:null => false}) + column_options.reverse_merge!(null: false) - t1_column, t2_column = [table_1, table_2].map{ |t| "#{t.to_s.singularize}_id" } + t1_column, t2_column = [table_1, table_2].map{ |t| t.to_s.singularize.foreign_key } - create_table(join_table_name, options.merge!(:id => false)) do |td| + create_table(join_table_name, options.merge!(id: false)) do |td| td.integer t1_column, column_options td.integer t2_column, column_options yield td if block_given? diff --git a/activerecord/lib/active_record/migration/join_table.rb b/activerecord/lib/active_record/migration/join_table.rb index e880ae97bb..e456c81fc9 100644 --- a/activerecord/lib/active_record/migration/join_table.rb +++ b/activerecord/lib/active_record/migration/join_table.rb @@ -8,7 +8,7 @@ module ActiveRecord end def join_table_name(table_1, table_2) - [table_1, table_2].sort.join("_").to_sym + [table_1, table_2].sort.join("_") end end end diff --git a/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb b/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb index c1f9d8962b..f6a432c6e5 100644 --- a/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb +++ b/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb @@ -21,7 +21,7 @@ module ActiveRecord when /join_table/ if attributes.length == 2 @migration_action = 'join' - @join_tables = attributes.map(&:name) + @join_tables = attributes.map(&:plural_name) set_index_names end @@ -30,9 +30,17 @@ module ActiveRecord def set_index_names attributes.each_with_index do |attr, i| - attr.index_name = [attr, attributes[i - 1]].map{ |a| :"#{a.name.singularize}_id"} + attr.index_name = [attr, attributes[i - 1]].map{ |a| index_name_for(a) } end end + + def index_name_for(attribute) + if attribute.foreign_key? + attribute.name + else + attribute.name.singularize.foreign_key + end.to_sym + end end end end diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb index 35cd40d25e..d2c2abf40c 100644 --- a/railties/lib/rails/generators/generated_attribute.rb +++ b/railties/lib/rails/generators/generated_attribute.rb @@ -90,8 +90,12 @@ module Rails end end + def plural_name + name.sub(/_id$/, '').pluralize + end + def human_name - name.to_s.humanize + name.humanize end def index_name @@ -102,6 +106,10 @@ module Rails end end + def foreign_key? + !!(name =~ /_id$/) + end + def reference? self.class.reference?(type) end diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb index 9f9cd9c9fc..774038c0e1 100644 --- a/railties/test/generators/migration_generator_test.rb +++ b/railties/test/generators/migration_generator_test.rb @@ -169,7 +169,7 @@ class MigrationGeneratorTest < Rails::Generators::TestCase def test_create_join_table_migration migration = "add_media_join_table" - run_generator [migration, "artists", "musics:uniq"] + run_generator [migration, "artist_id", "musics:uniq"] assert_migration "db/migrate/#{migration}.rb" do |content| assert_method :change, content do |up| |