每次我运行rake db:migrate时,rails都决定更改我的schema.rb文件。在某些情况下,这是完全合理的,但在其他情况下,它似乎是毫无理由地这样做的。让我感到困惑的是,当我从git中拉出一个新的迁移和新版本的schema.rb,然后运行rake db:migrate。由于这次迁移附带了新版本的schema.rb文件,因此我不应该更新schema.rb。然而,rails每次都会改变它。当这种情况发生时,我会发现非常愚蠢的变化,比如:
add_index "my_table", ["column1", "column2"], :name => "index_on_some_columns"至
add_index "my_table", ["column2", "column1"], :name => "index_on_some_columns"当这种情况发生时,我只是简单地运行git checkout db/schema.rb并继续我的生活,但它让我恼火得没完没了。它这样做有什么原因吗?我怎样才能阻止它这样做呢?
编辑:以下是diff的摘录
@@ -165,12 +165,11 @@ ActiveRecord::Schema.define(:version => 20130206001907) do
t.column "updated_at", :datetime
- t.column "coordinates", :point, :srid => 4326
@@ -200,15 +199,16 @@ ActiveRecord::Schema.define(:version => 20130206001907) do
t.column "something", :boolean
+ t.column "coordinates", :point, :srid => 4326
+ t.column "random_string", :string
t.column "remote", :string
- t.column "random_string", :string
end
- add_index "my_table", ["id", "foreign_id"], :name => "index_active_my_table_on_foreign_and_id"
- add_index "my_table", ["id", "active"], :name => "index_my_table_on_active_and_id"
- add_index "my_table", ["id", "content_modified_at"], :name => "index_my_table_on_content_modified_at_and_id"
+ add_index "my_table", ["foreign_id", "id"], :name => "index_active_my_table_on_foreign_and_id"
+ add_index "my_table", ["active", "id"], :name => "index_my_table_on_active_and_id"
+ add_index "my_table", ["content_modified_at", "id"], :name => "index_my_table_on_content_modified_at_and_id"发布于 2013-02-13 06:36:27
由于这次迁移附带了新版本的schema.rb文件,因此我不应该更新schema.rb。
这是不准确的。
Rails每次运行迁移时,都会使用数据库作为源来更新schema.rb文件。它不查看现有的schema.rb文件,它只是使用数据库中的信息并覆盖它。
似乎真正的问题是,在两个不同的环境( Ruby、Rails、MySQL、操作系统的不同组合)中运行相同的迁移可能会在生成schema.rb文件时产生不同的结果。
解决方案是确保每个签入代码的人都在尽可能地使用相同的软件版本。如果这是不可能的(因为这是Windows与Linux和Mac的区别,你不想改变你的操作系统),你将不得不处理不便。
发布于 2016-09-01 08:19:15
对我来说,解决方案是先做一个rake db:schema:load。然后rake db:migrate就不再无缘无故地更改我的schema.rb。
警告: rake db:schema:load将删除您现有数据的所有,并根据现有schema.rb重新创建数据库。
https://stackoverflow.com/questions/14842557
复制相似问题