0

我尝试了谷歌搜索和stackoverflowing,但找不到答案,所以我想我会发布一个。

目前我继承了一个遗留系统(PHP/MySQL),其中表名和列名以驼峰形式定义(即tableName、columnName)。我想将此系统迁移到 RoR,并希望将 MySQL 表也转换为蛇案例(即 table_name、column_name)。

我怎样才能有效地做到这一点并且仍然成功地迁移数据?有没有人这样做过?

4

2 回答 2

1

您可以使用 Rails 数据库迁移重命名表和列。

您可以创建一个迁移文件来重命名表,并创建另一个迁移文件来重命名其列。

假设我们要重命名emailSubscriptions表。

> bundle exec rails generate migrations rename_email_subscriptions
# this creates db/migrate/xxxxxxxx_rename_email_subscriptions.rb

编辑迁移文件

# this creates db/migrate/xxxxxxxx_rename_email_subscriptions.rb

class RenameEmailSubscriptions < ActiveRecord::Migration
  def change
    rename_table :emailSubscriptions, :email_subscriptions
  end
end

对于列

> bundle exec rails generate migrations rename_email_subscriptions_columns
# this creates db/migrate/xxxxxxxx_rename_email_subscriptions_columns.rb

编辑迁移文件

# this creates db/migrate/xxxxxxxx_rename_email_subscriptions_columns.rb

class RenameEmailSubscriptionsColumns < ActiveRecord::Migration
  def change
    change_table :email_subscriptions do |t|
      t.rename :columnName1, :column_name_1
      t.rename :columnName2, :column_name_2
      t.rename :columnName3, :column_name_3
      t.rename :columnName4, :column_name_4
    end
  end
end

bundle exec rake db:migrate

对所有表及其对应的列执行此操作。

请注意,我决定拆分迁移以重命名表及其列,以便可以回滚迁移。

于 2019-08-15T08:34:27.747 回答
0

您可以覆盖模型中的表名:

class Project < ActiveRecord::Base
  self.table_name = "project"
end

或者

class Post < ActiveRecord::Base
  def self.table_name
    "special_" + super
  end
end

Post.table_name # => "special_posts"

更多信息: http: //guides.rubyonrails.org/3_2_release_notes.html

您还可以制作一个脚本并重命名您的表格并在之后使用 rails 约定,这取决于您!

从那里您可以使用 rails 迁移重命名列名: 如何在 Ruby on Rails 迁移中重命名数据库列?

于 2012-09-19T11:57:39.813 回答