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

Ruby on rails 如何编写迁移来重命名Rails中的ActiveRecord模型及其表?,ruby-on-rails,migration,rails-activerecord,Ruby On Rails,Migration,Rails Activerecord,我在命名方面很糟糕,我意识到在我的Rails应用程序中有一组更好的模型名称有没有办法使用迁移重命名模型及其对应的表?以下是一个示例: class RenameOldTableToNewTable < ActiveRecord::Migration def self.up rename_table :old_table_name, :new_table_name end def self.down rename_table :new_table_name, :o

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

以下是一个示例:

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

(您仍然需要查看并手动重命名您的文件。)

其他答案和注释包括表格重命名、文件重命名和代码的重新编译

我想补充几点注意事项:

让我们用我今天遇到的一个现实例子:将模型从“商人”重命名为“商业”

  • 不要忘记在中更改依赖表和模型的名称 同样的迁移。我将我的Merchant和MerchantStat模型同时更改为Business和BusinessStat。否则,在执行搜索和替换时,我将不得不进行太多的拾取和选择
  • 对于通过外键依赖于您的模型的任何其他模型,其他表的外键列名将从您的原始模型名派生。因此,您还需要对这些依赖模型执行一些rename_列调用。例如,我必须在各种连接表(对于has\u和has\u-belish\u-to\u-many关系)和其他依赖表(对于普通has\u-one和has\u-many关系)中将“merchant\u-id”列重命名为“business\u-id”。否则的话,我会看到像“business\u stat.merchant\u id”这样的列指向“business.id”
  • 放大时,请记住搜索单数、复数、大写、, 小写,甚至大写(可能出现在注释中)版本 你的弦
  • 最好先搜索复数,然后搜索单数。那个 如果你有一个不规则的复数形式,比如在《我的商人》中: 商业示例-您可以正确地获得所有不规则复数。 否则,您可能会以例如“businesss”(3个)作为结束语 中间状态,导致更多的搜索和替换
  • 不要盲目地替换每一个事件。如果模型名称冲突 使用通用编程术语,使用其他模型中的值,或使用 如果视图中包含文本内容,您可能会过于急切。 在我的示例中,我想将型号名称更改为“Business”,但 在我的用户界面的内容中仍然将它们称为“商家”。在CanCan中,我还为我的用户提供了一个“商家”角色——正是商家角色和商家模型之间的混淆导致我首先重命名了模型

您还需要替换索引:

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
类重命名eoldtabletonewtable
和重命名您的文件等,手动作为其他答案在这里描述

见:

确保编写此迁移后可以回滚和前滚。如果您遇到了一些错误,并且被试图影响不再存在的内容的迁移所困扰,那么这可能会变得很棘手。如果无法回滚,最好丢弃整个数据库并重新启动。因此,请注意,您可能需要备份某些内容

另外:检查schema_db中由has_uu或belown_u所定义的其他表中的任何相关列名。你可能也需要编辑这些


最后,在没有回归测试套件的情况下这样做是愚蠢的

在Rails 4中,我所要做的就是更改def

def change
  rename_table :old_table_name, :new_table_name
end
我所有的索引都为我准备好了。我不需要通过删除旧索引和添加新索引来手动更新索引

它还可以通过改变索引的上移或下移来工作。

您可以这样做 执行以下命令:railsgmigration 将{old_table_name}重命名为{new_table_name}

编辑文件并在方法更改中添加此代码后


重命名表格:{old_table_name},:{new_table_name}

我建议在这个问题中添加“ActiveRecord”以改进搜索引擎匹配。我一直在使用“ActiveRecord重命名表”查找这个问题。如果您使用的是迁移,那么这个问题比看起来更复杂。选定的解决方案表示,在更改表名后,返回并手动重命名模型、控制器等。如果这样做,所有以旧名称引用模型的旧迁移都将失败。因此,当有人克隆您的repo并尝试运行rake db:migrate时,它将失败。您可以在迁移过程中返回并更改这些名称,但这会变得很混乱。你最好只是创建一个全新的模型,而不是重命名它。@Andrewannigan:如果有人克隆了你的repo并只是运行
rake db:schema:load
?@istrasci:绝对正确,你的观点就没有意义了。事实上,运行
rake db:migrate
从头开始建立数据库是不被鼓励的,这正是因为andrew指出的问题。@mathee:是的,你必须手动更改它,或者使用一个可以进行Ruby重构并将其提交到版本控制系统的IDE。git grep是你的朋友。我现在正在将一个活动重命名为一个习惯:
git grep-I activit
非常具有启发性。您还必须更改控制器的内容,对吗?并且不要忘记您的路线。rb!另外,作为提示,您希望在rename_table调用中使用表名的复数版本。对于rails 4.0.0.beta1迁移,不需要手动更新索引。AR会自动更新它。
def change
  rename_table :old_table_name, :new_table_name
end