diff options
author | Aleksey Magusev <lexmag@gmail.com> | 2012-07-11 01:38:21 +0400 |
---|---|---|
committer | Aleksey Magusev <lexmag@gmail.com> | 2012-07-18 00:13:19 +0400 |
commit | 211d88b71b3df2ae161b23579a79f8e937132388 (patch) | |
tree | 531ae144bfd1e3fa8bcad17d31547d4dd4d84bb2 /activerecord/lib/rails/generators/active_record/migration | |
parent | d4811702510bf289bb07ce93263cd04d49e96bea (diff) | |
download | rails-211d88b71b3df2ae161b23579a79f8e937132388.tar.gz rails-211d88b71b3df2ae161b23579a79f8e937132388.tar.bz2 rails-211d88b71b3df2ae161b23579a79f8e937132388.zip |
Add join table migration generator
For instance, running
rails g migration CreateMediaJoinTable artists musics:uniq
will create a migration with
create_join_table :artists, :musics do |t|
# t.index [:artist_id, :music_id]
t.index [:music_id, :artist_id], unique: true
end
Diffstat (limited to 'activerecord/lib/rails/generators/active_record/migration')
-rw-r--r-- | activerecord/lib/rails/generators/active_record/migration/migration_generator.rb | 23 | ||||
-rw-r--r-- | activerecord/lib/rails/generators/active_record/migration/templates/migration.rb | 10 |
2 files changed, 27 insertions, 6 deletions
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 1509e34473..c1f9d8962b 100644 --- a/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb +++ b/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb @@ -11,15 +11,28 @@ module ActiveRecord end protected - attr_reader :migration_action + attr_reader :migration_action, :join_tables - def set_local_assigns! - if file_name =~ /^(add|remove)_.*_(?:to|from)_(.*)/ - @migration_action = $1 - @table_name = $2.pluralize + def set_local_assigns! + case file_name + when /^(add|remove)_.*_(?:to|from)_(.*)/ + @migration_action = $1 + @table_name = $2.pluralize + when /join_table/ + if attributes.length == 2 + @migration_action = 'join' + @join_tables = attributes.map(&:name) + + set_index_names end end + end + def set_index_names + attributes.each_with_index do |attr, i| + attr.index_name = [attr, attributes[i - 1]].map{ |a| :"#{a.name.singularize}_id"} + end + end end end end diff --git a/activerecord/lib/rails/generators/active_record/migration/templates/migration.rb b/activerecord/lib/rails/generators/active_record/migration/templates/migration.rb index 34eaffcb0f..d5c07aecd3 100644 --- a/activerecord/lib/rails/generators/active_record/migration/templates/migration.rb +++ b/activerecord/lib/rails/generators/active_record/migration/templates/migration.rb @@ -12,6 +12,14 @@ class <%= migration_class_name %> < ActiveRecord::Migration <%- end -%> <%- end -%> end +<%- elsif migration_action == 'join' -%> + def change + create_join_table :<%= join_tables.first %>, :<%= join_tables.second %> do |t| + <%- attributes.each do |attribute| -%> + <%= '# ' unless attribute.has_index? -%>t.index <%= attribute.index_name %><%= attribute.inject_index_options %> + <%- end -%> + end + end <%- else -%> def up <% attributes.each do |attribute| -%> @@ -40,4 +48,4 @@ class <%= migration_class_name %> < ActiveRecord::Migration <%- end -%> end <%- end -%> -end
\ No newline at end of file +end |