Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重命名列删除列的所有内容_Ruby On Rails_Database_Ruby On Rails 3_Migration - Fatal编程技术网

Ruby on rails 重命名列删除列的所有内容

Ruby on rails 重命名列删除列的所有内容,ruby-on-rails,database,ruby-on-rails-3,migration,Ruby On Rails,Database,Ruby On Rails 3,Migration,您好,我遇到了rails迁移问题: 当我运行这样的迁移时: class RenameColumn < ActiveRecord::Migration def change rename_column :users, :hotel_stars, :rating_stars rename_column :users, :restaurant_stars, :price_stars end end classrenamecocolumn创建用户表 添加列到默认用户->添

您好,我遇到了rails迁移问题:

当我运行这样的迁移时:

class RenameColumn < ActiveRecord::Migration
  def change
    rename_column :users, :hotel_stars, :rating_stars
    rename_column :users, :restaurant_stars, :price_stars
  end
end
classrenamecocolumn

然后做一个rakedb:migrate,它工作得很好。列被重命名,并且这些列的数据在其中。但是当我执行rakedb:drop、create、migrate时,这些列被重命名,并且这些列的数据消失了。。。(我的一个迁移文件将填充数据库,并在重命名前填充这两列)

这里有什么问题

另一个问题:我知道更改以前的迁移文件不是一个好主意,但是当我在以后运行rake db:drop db:create和db:migrate时,这样可以吗?或者这会导致问题吗

我的迁移文件的顺序如下:

添加\设计\到\用户->创建用户表

添加列到默认用户->添加列并更新整个表

class AddColumnsToDefaultUser < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_column :users, :dob, :date
    add_column :users, :address, :string
    add_column :users, :hotel_stars, :integer
    add_column :users, :restaurant_stars, :integer
    add_column :users, :profile_picture_url, :string
    add_column :users, :selected_car, :integer

    User.reset_column_information

    User.find(1).update_attributes!( :name => 'Alexander MacDonald', :dob => '1984-08-20', :address => '900 Highschool Way, Mountain View, CA 94041', :hotel_stars => '3', :restaurant_stars => '2', :profile_picture_url => 'user1.png', :selected_car => 1)

  end
end
class AddColumnsToDefaultUser'Alexander MacDonald',:dob=>'1984-08-20',:address=>'900 Highschool Way,Mountain View,CA 94041',:hotel_stars=>'3',:restaurant_stars=>'2',:profile_picture_url=>'user1.png',:selected_car=>1)
结束
结束
然后重命名_列

class RenameColumn < ActiveRecord::Migration
  def change
    rename_column :users, :hotel_stars, :rating_stars
    rename_column :users, :restaurant_stars, :price_stars
  end
end
classrenamecocolumn
当您执行
db:drop
操作时,您正在擦除数据库。

因此,当您这样做时,数据将被擦除。该数据不会进入临时位置重新插入。如果要保留
DB:drop之前/之后的DB中的数据,需要将其存储在某个位置,然后自己重新插入

当您仅更改结构时,除非您有特定的理由删除其中已有的数据,否则只需执行
db:migrate


或者,您可以使用类似的方法,以便在迁移后用测试数据清空/填充数据库。

如果删除数据库,数据当然会消失。我的一个迁移文件会填充数据库,并填充这两列。但是在重命名这两列的数据之后,我认为应该使用seed.rb来填充数据库,并使用rake db:setup来创建和提供它。按照你的方式做并不困难,但我认为它更正确。我知道数据会被删除,但我的一个迁移文件会填充表(工作!),但在重命名两列后,这两列是空的……填充表的迁移(1)是否考虑到列已被重命名,以及(2)在
db:drop
之后运行?填充表内容的迁移文件当然不知道新列名。而在旧迁移文件中更改代码并不是迁移的工作方式,对吗?所以我没有对填充列的迁移文件做任何更改。但是你可以在上面我的问题中查看顺序。谢谢你的帮助哦,我明白了,我明白了,你是对的——仅从这个描述就可以了。所以我们缺少了一些东西。这里基本上有两种方法。(1) 在迁移中执行某种类型的输出,以查看数据何时丢失(或由于某种原因从未插入)或(2)不要修改/删除/重新运行迁移-如果需要更改某些内容,只需进行新的迁移。社区中对于哪种方法是正确的存在一些冲突(一些人认为所有迁移都应该是可逆的),而另一些人更喜欢简单地使用
db:schema:load
,并使用种子文件。我认为您只希望这里是迁移的调试输出,以了解数据丢失的原因。也许,出于某种原因,它不再被插入到最初的位置,或者它在那里然后消失了。在继续之前,我会仔细检查你的假设,它实际上被正确插入。另外,为了回答您在原始帖子中的另一个问题,是的,我想说修改以前的迁移是一个非常糟糕的主意。改为进行新的迁移。改变在中间的某个地方迁移只是会使事情复杂化。