ruby-on-rails 如何编写迁移来重命名Rails中的ActiveRecord模型及其表?

qgzx9mmu  于 2023-03-09  发布在  Ruby
关注(0)|答案(6)|浏览(152)

我在命名方面很糟糕,但我意识到在我的Rails应用程序中有一组更好的模型名称。
有没有办法使用迁移来重命名模型及其对应的表?

jucafojl

jucafojl1#

下面是一个例子:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def self.up
    rename_table :old_table_name, :new_table_name
  end

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

我不得不手动重命名模型声明文件。

编辑:

在Rails 3.1和4中,ActiveRecord::Migration::CommandRecorder知道如何反向迁移rename_table,所以你可以这样做:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(You仍然必须通过和手动重命名您的文件。)

ybzsozfc

ybzsozfc2#

在Rails4中,我所要做的就是修改def

def change
  rename_table :old_table_name, :new_table_name
end

而且我所有的索引都为我处理好了。我不需要通过删除旧的索引和添加新的索引来手动更新索引。
它也可以使用这些变化来提高或降低指数。

r1wp621o

r1wp621o3#

其他的回答和评论涉及表重命名、文件重命名和代码中的greping。
我想再补充几点:
让我们举一个我今天面对的现实世界的例子:将模型从“Merchant”重命名为“Business”。

  • 不要忘记在同一迁移中更改依赖表和模型的名称。我同时将Merchant和MerchantStat模型更改为Business和BusinessStat。否则,在执行搜索和替换时,我将不得不进行太多的挑选。
  • 对于通过外键依赖于您的模型的任何其他模型,其他表的外键列名将从您的原始模型名派生,因此您还需要对这些依赖模型执行一些rename_column调用。我不得不在各个连接表中将“merchant_id”列重命名为“business_id(对于has_and_belongs_to_many关系)和其他依赖表(对于正常的has_one和has_many关系)。否则,我将以类似“business_stat.merchant_id”的指向“business.id”的列结束。Here's a good answer about doing column renames.
  • 进行grep时,请记住搜索字符串的单数、复数、大写、小写甚至大写(可能出现在注解中)版本。
  • 最好先搜索复数形式,然后搜索单数形式,这样如果你有不规则的复数形式,比如my merchants::businesss的例子-你可以把所有不规则的复数都弄对。否则你可能会以“businesss”(3个)作为中间状态而告终,从而导致更多的搜索和替换。
  • 不要盲目地替换每一个示例。如果您的模型名称与常见的编程术语、其他模型中的值或视图中的文本内容冲突,您可能最终会过于急切。在我的示例中,我想将我的模型名称更改为“Business”,但在UI的内容中仍将其称为“merchants”。我还为我的用户在CanCan中设置了“merchant”角色-正是商人角色和商人模型之间的混淆导致我首先重命名模型。
pgx2nnw8

pgx2nnw84#

您还需要替换索引:

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

和重命名您的文件等,手动为其他答案在这里描述。
参见:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
请确保在编写此迁移后可以回滚和前滚。如果出现错误,并且迁移尝试影响不再存在的内容时遇到困难,则可能会很棘手。如果无法回滚,最好丢弃整个数据库并重新开始。因此请注意,您可能需要备份某些内容。
另外:在schema_db中查找由has_ or belongs_to或其他函数定义的其他表中的相关列名,可能也需要编辑这些列名。
最后,在没有回归测试套件的情况下完成这项工作将是愚蠢的。

xpcnnkqh

xpcnnkqh5#

您可以执行以下命令:rails g迁移将{旧表名}* 重命名为 *{新表名}
编辑文件并在方法更改中添加此代码之后
重命名表格:{旧表格名称},:{新表格名称}

7eumitmz

7eumitmz6#

更现代、更有效的方法是:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    reversible do |dir|
      dir.up do
        rename_table :old_table_name, :new_table_name
      end
      dir.down do
        rename_table :new_table_name, :old_table_name
      end
    end
  end
end

++不要忘记手动重命名模型声明文件。

个人经历:

我尝试了@readonly的解决方案来重命名我的表。我只需要在表的末尾添加一个“S”,所以我的旧表和新表之间的唯一区别就是这个字母。这个解决方案不起作用。Rails认为这是同一个表,因此没有做任何更改。我尝试了我上面给出的现代解决方案,它工作正常。

  • 导轨版本:6.1.7.2*

相关问题