使用 "rails g migration" 命令生成列重命名迁移?

17

我想自动生成一个迁移文件,内容看起来像这样:

class RenameDatabaseColumn < ActiveRecord::Migration
  def change
    rename_column :events, :subcategory, :subcategory_id
  end
end

有没有一种方法可以格式化我的

rails g migration ~rename_column_events_subcategory_subcategory_id~

还是类似的东西来自动生成那个文件?


可能是如何在Rails迁移中重命名数据库列?的重复问题。 - rails_id
3个回答

15

没有针对“重命名”列的自动生成命令。

参考源代码。自动生成器只能理解“to”、“from”、“add”、“remove”、“join_table”和“create”。


0

目前还没有自动生成命令来重命名列。 您需要手动更改它,然后运行rake db:migrate


0

你可以为rename_column创建自定义生成器

# lib/generators/ext/rename_column.rb
ActiveSupport.on_load(:active_record) do
  ActiveRecord::Generators::MigrationGenerator.class_eval do
    alias :origin_create_migration_file :create_migration_file
    def create_migration_file
      if file_name =~ /^rename_(.*)_to_(.*)_on_(.*)/
        @old_column = $1
        @new_column = $2
        @table_name = normalize_table_name($3)
        @migration_template = File.join(Rails.root, "lib", "generators", "ext", "templates", "rename_column_migration.rb")
        
        validate_file_name!
        migration_template @migration_template, File.join(db_migrate_path, "#{file_name}.rb")
      else
        origin_create_migration_file
      end
    end
  end
end

# lib/generators/ext/templates/rename_column_migration.rb.tt
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
  def change
    rename_column :<%= table_name %>, :<%= @old_column %>, :<%= @new_column %>
  end
end

# config/initializers/ext_core.rb
require File.join(Rails.root, "lib", "generators", "ext", "rename_column.rb")

现在你可以像这样自动生成rename_column
$ rails g migration RenameTitleToNameOnProducts
create    db/migrate/20210906044147_rename_title_to_name_on_products.rb

# result
class RenameTitleToNameOnProducts < ActiveRecord::Migration[6.1]
  def change
    rename_column :products, :title, :name
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接