我创建了一个表Users,在重构我们的设计后,我们意识到表中需要更多的字段。这个表在三个不同的迁移文件中修改,我想在不丢失所有数据的情况下将它重构到一个文件中。知道怎么做吗?这是我的三个迁移:
`
class CreateUsers < ActiveRecord::Migration[7.0]
def change
drop_table(:users, if_exists: true) # uncomemnt only if you want to reset
create_table :users do |t|
t.string :username
t.string :email
t.string :password_digest
t.timestamps
end
end
end
class AddEmailToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :email, :string
end
end
`
class AddStudentToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :student, :boolean
add_column :users, :landlord, :boolean
end
end
``
我想将这些迁移合并到一个迁移中,例如
`
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :username
t.string :email
t.string :password_digest
t.boolean :is_student
t.boolean : is_landlord
t.timestamps
end
end
end
`
知道如何重构吗?当我运行这个新的迁移来创建新表时,我得到一个错误。有没有方法来创建和存储旧数据?
尝试进行新的迁移,重新构建表并保存旧数据。尝试使我的代码看起来更干净。
1条答案
按热度按时间yeotifhr1#
不重构迁移。
一般而言,编辑现有的移转并不是一个好主意。如果移转的现有版本已经在实际执行计算机上执行,您会为自己和同事造成额外的工作,而且会造成严重的问题。您应该撰写新的移转来执行您所需的变更。编辑新产生的移转,而且尚未认可至原始档控制(或者,更一般地说,尚未传播到开发计算机之外)相对无害。https://guides.rubyonrails.org/active_record_migrations.html
除此之外,这也是一种巨大的时间浪费,因为迁移只是为了提供一种在不同环境中以可重复的方式转换数据模式的机制,而不是为了在代码库中长期存在。
事实上,一旦在所有环境中运行了迁移,就应该将其删除 *。在设置新环境时,应该通过从
schema.rb
或structure.sql
重新创建架构来完成迁移,而不是运行项目在其生命周期内积累的每个迁移,这非常缓慢且容易出错。如果您需要再次进行迁移(实际上不会),它将记录在VCS历史记录中。