标签: rails-migrations

解决Rails孤立迁移的最佳方法是什么?

我一直在项目中的分支之间切换,每个分支都有不同的迁移...这是场景:

$ rake db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   ...
   up     20130307154128  Change columns in traffic capture
   up     20130311155109  Remove log settings
   up     20130311160901  Remove log alarm table
   up     20130320144219  ********** NO FILE **********
   up     20130320161939  ********** NO FILE **********
   up     20130320184628  ********** NO FILE **********
   up     20130322004817  Add replicate to root settings
   up     20130403190042  ********** NO FILE **********
   up     20130403195300  ********** NO FILE **********
   up     20130403214000  ********** NO FILE **********
   up     20130405164752  Fix ap hostnames
   up     20130410194222  ********** …
Run Code Online (Sandbox Code Playgroud)

migration git ruby-on-rails rails-migrations ruby-on-rails-3

34
推荐指数
5
解决办法
1万
查看次数

如何创建迁移以仅在存在时删除索引,而不是抛出异常(如果不存在)?

目前,如果books表没有created_atupdated_at字段,当前迁移可能会失败:

class AddTimestampIndexes < ActiveRecord::Migration
  def up
    remove_index :books, :created_at
    remove_index :books, :updated_at

    add_index  :books, :created_at
    add_index  :books, :updated_at
  end

  def down
    remove_index :books, :created_at
    remove_index :books, :updated_at
  end
end
Run Code Online (Sandbox Code Playgroud)

remove_index如果无法删除索引而不是引发错误,是否采取任何选项以静默方式继续?

ruby-on-rails rails-migrations ruby-on-rails-4

32
推荐指数
3
解决办法
2万
查看次数

Rails:用于创建固定长度char(12)列的迁移

通过Rails迁移定义固定长度SQL列(例如CHAR(12))的最佳方法是什么?

为什么这不应该由模型处理是因为CHAR()与VARCHAR()的表现,我想,以避免在数据库中注入原始的SQL.

编辑:我知道:limit修饰符,但是该字段仍然是varchar(这对性能有害)并且不允许最小大小.

sql ruby-on-rails rails-migrations

31
推荐指数
4
解决办法
3万
查看次数

Rails rake db:migrate没有任何影响

我今天制作了一个新的Rails 3应用程序,添加了一个简单的迁移,并且出于某种原因,当我执行rake db:migrate时没有任何反应.它只是暂停几秒钟,然后返回到命令提示符,没有任何错误或任何错误.Schema.rb和数据库保持空白.

什么想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题.一切都是完全标准的设置.

rake activerecord ruby-on-rails rails-migrations ruby-on-rails-3

30
推荐指数
1
解决办法
2万
查看次数

Rails迁移:尝试将列的类型从字符串更改为整数

我在rails应用程序中使用rails generate migrations命令创建了一个表.这是迁移文件:

class CreateListings < ActiveRecord::Migration
  def change
    create_table :listings do |t|
      t.string :name
      t.string :telephone
      t.string :latitude
      t.string :longitude

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我想将纬度和经度存储为整数,所以我试图运行:

rails generate migration changeColumnType
Run Code Online (Sandbox Code Playgroud)

并且该文件的内容是:

class ChangeColumnType < ActiveRecord::Migration
  def up
    #change latitude columntype from string to integertype
    change_column :listings, :latitude, :integer
    change_column :listings, :longitude, :integer
    #change longitude columntype from string to integer type
  end

  def down  
  end
end
Run Code Online (Sandbox Code Playgroud)

我期待列类型改变但是rake被中止并且出现以下错误消息.我想知道为什么这不通过?我在我的应用程序中使用postgresql.

rake db:migrate
==  ChangeColumnType: migrating ===============================================
-- change_column(:listings, :latitude, :integer)
rake aborted!
An error …
Run Code Online (Sandbox Code Playgroud)

ruby postgresql casting ruby-on-rails rails-migrations

30
推荐指数
4
解决办法
3万
查看次数

我可以将默认值传递给rails生成迁移吗?

我想知道是否可以将默认值传递给rails g migration命令.就像是:

 $ rails generate migration add_disabled_to_users disabled:boolean:false #where false is default value for disabled attribute
Run Code Online (Sandbox Code Playgroud)

为了生成:

class AddDisabledToUsers < ActiveRecord::Migration
  def change
    add_column :users, :disabled, :boolean, default: false
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-migrations ruby-on-rails-3

30
推荐指数
3
解决办法
2万
查看次数

在具有多个容器实例的Docker容器中使用Rails运行迁移

我已经看到很多为Rails应用程序制作Docker容器的例子.通常,他们运行rails服务器并拥有运行迁移/设置的CMD,然后启动Rails服务器.

如果我同时生成其中5个容器,Rails如何处理尝试启动迁移的多个进程?我可以看到Rails检查通用查询日志中的当前模式版本(它是一个MySQL数据库):

 SELECT `schema_migrations`.`version` FROM `schema_migrations`
Run Code Online (Sandbox Code Playgroud)

但是如果在不同的Rails实例上同时发生这种情况,我可以看到竞争条件.

考虑到DDL在MySQL中不是事务性的,并且我在运行迁移时看不到通用查询日志中发生任何锁定(除了每次迁移事务),看起来并行启动它们是个坏主意.事实上,如果我在本地启动三次,我可以看到两个rails实例在尝试创建表时崩溃,因为它已经存在,而第三个rails实例很快就完成了迁移.如果这是一个将某些东西插入数据库的迁移,那将是非常不安全的.

那么运行一个运行迁移/设置的单个容器然后产生(例如)一个Unicorn实例然后生成多个rails工作人员会更好吗?

我是否应该产生N个轨道容器和一个运行迁移的"迁移容器"然后退出?

有更好的选择吗?

mysql ruby-on-rails database-migration rails-migrations docker

30
推荐指数
2
解决办法
1万
查看次数

在Rails 5中添加引用列迁移

用户有很多上传.我想在上传表中添加一个引用该用户的列.迁移应该是什么样的?

Rails 3的相关问题:Rails 3迁移:添加参考列?

Rails 4的相关问题:在Rails 4中添加引用列迁移

rails-migrations rails-activerecord ruby-on-rails-5

29
推荐指数
1
解决办法
2万
查看次数

如何在Rails迁移中将列(包含内容)移动到另一个表?

我需要将一些列从一个现有表移动到另一个表.如何使用rails迁移执行此操作?

class AddPropertyToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :someprop, :string
    remove_column :profiles, :someprop
  end

  def self.down
    add_column :profiles, :someprop, :string
    remove_column :users, :someprop
  end
end
Run Code Online (Sandbox Code Playgroud)

以上只是创建新列,但值保持为空...

我想避免登录到数据库以手动更新表.

如果有一种以编程方式移动列值的方法,那么性能特征是什么?它会逐行进行,还是有办法批量更新?

data-migration ruby-on-rails rails-migrations

28
推荐指数
4
解决办法
1万
查看次数

如何使用Rails 3样式迁移(def更改)识别迁移方向(向上或向下)?

我非常喜欢Rails 3样式的迁移,即一种change智能足以识别迁移是否正在安装或回滚的方法,因此我不必编写updown方法相互镜像.但我有一种情况,我需要在回滚迁移时跳过一些代码(更新counter_cache我正在添加的列).

我查看了http://guides.rubyonrails.org/migrations.html,但第5节末尾的示例遇到了同样的问题:

class AddFuzzToProduct < ActiveRecord::Migration
  class Product < ActiveRecord::Base
  end
  def change
    add_column :products, :fuzz, :string
    Product.reset_column_information
    Product.all.each { |f| f.update_attributes! :fuzz => 'fuzzy' }
  end
end
Run Code Online (Sandbox Code Playgroud)

回滚此迁移时,fuzz不需要更新字段.有没有办法防止它?

我尝试过Product.column_names但是由于Rails足够智能以反向执行迁移,因此在删除列之前执行更新.此外,当change定义方法时,似乎忽略任何updown方法.还有其他想法吗?

migration ruby-on-rails rails-migrations ruby-on-rails-3

27
推荐指数
3
解决办法
6299
查看次数