标签: rails-migrations

管理同一台计算机上不同分支的Rails迁移

我在我工作的公司里是一个单人乐队.我开发了一个Rails应用程序供公司内部使用.从项目开始以来,我已经使用SVN进行源代码控制,并完成了大部分(但不是全部)在trunk中的开发.偶尔,当我做了非常重大的改变时,我已经分支并在完成后将更改合并回来.一切都很典型.

但是,我所做的那些"重大变化"都没有触及过数据库迁移.它们一直是视图/控制器的东西.

在这种情况下,使用一个开发框,我如何解决我可能会或可能不会保留的迁移和各种数据库更改?我不想记得在将分支丢弃之前将所有迁移恢复到分支的开头,如果它不起作用的话.

我已经考虑过设置特殊的开发环境和数据库(app_branch而不是app_development),但这似乎与实验开发倾向于依赖的"简单分支"概念有很大关系.

这种情况有最佳做法吗?在这种情况下,其他人在做什么?

svn migration ruby-on-rails rails-migrations

6
推荐指数
1
解决办法
1189
查看次数

将更新逻辑放入迁移中

有几次我一直处于这种情况,我想重构一些模型的设计,并最终将更新逻辑放入迁移中.但是,据我所知,这不是一种好的做法(特别是因为鼓励您使用模式文件进行部署,而不是迁移).你如何处理这些问题?

要清楚我的意思,请说我有一个用户模型.由于我认为只有两种用户,即"普通"用户和管理员,我选择使用一个简单的布尔字段来判断用户是否是管理员.

然而,在我想到我需要第三类用户之后,可能是主持人或类似的东西.在这种情况下,我添加了一个UserType模型(和相应的迁移),以及第二次迁移,用于从用户表中删除"admin"标志.这就是问题所在.在"add_user_type_to_users"迁移中,我必须将admin标志值映射到用户类型.此外,为了做到这一点,用户类型必须存在,这意味着我不能使用种子文件,而是在迁移中创建用户类型(也被认为是不好的做法).这里有一些代表情况的虚构代码:

class CreateUserTypes < ActiveRecord::Migration
    def self.up
        create_table :user_types do |t|
            t.string :name, :nil => false, :unique => true
        end

        #Create basic types (can not put in seed, because of future migration dependency)
        UserType.create!(:name => "BASIC")
        UserType.create!(:name => "MODERATOR")
        UserType.create!(:name => "ADMINISTRATOR")
    end

    def self.down
        drop_table :user_types
    end
end

class AddTypeIdToUsers < ActiveRecord::Migration
    def self.up
        add_column :users, :type_id, :integer

        #Determine type via the admin flag
        basic = UserType.find_by_name("BASIC")
        admin = UserType.find_by_name("ADMINISTRATOR")
        User.all.each {|u| u.update_attribute(:type_id, (u.admin?) ? admin.id : …
Run Code Online (Sandbox Code Playgroud)

migration ruby-on-rails rails-migrations

6
推荐指数
1
解决办法
1080
查看次数

使用rake db:直接迁移,vanilla SQL

使用rake db:migrate加载vanilla SQL 会涉及到什么问题?

我正在使用的业务要求不允许我使用默认的Rails迁移.但我仍然需要跟踪更改,轻松更改数据库DDL以及Rails迁移为您提供的其他内容.

所以迁移文件看起来像:

class AddDateToPost < ActiveRecord::Migration
  def self.up
    ActiveRecord::Base.connection.execute("ALTER TABLE `posts` ADD COLUMN date DATETIME NULL")
  end

  def self.down
    ActiveRecord::Base.connection.execute("ALTER TABLE `posts` DROP COLUMN date")
  end
end
Run Code Online (Sandbox Code Playgroud)

rake ruby-on-rails rails-migrations

6
推荐指数
1
解决办法
3174
查看次数

使用UUID主键进行ActiveRecord迁移

在我想要创建的迁移中,表的主键是一个名为"id"的字段,但它不是一个自动递增的整数.它的数据类型应该是uniqueidentifier(一个uuid).这是我尝试过的:

create_table :some_things, :id => false do |t|
  t.column :id, :uniqueidentifier, :primary => true
  t.column :name, :string, :limit => 255
  t.column :type, :tinyint
  t.column :deleted_flag, :bit
  t.column :class_id, :uniqueidentifier
  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

这会创建表,但没有主键(因为我说:id => false).如果我说"create_table:some_things,:id => true,:primary =>:id",则"id"成为主键,但它是一个自动递增的整数,而不是非自动递增的uuid.

如何使此迁移工作,以便主键是一个名为"uniqueidentifier"类型的"id"字段(非自动递增)?

我正在使用:SQL Server 2008,Rails/ActiveRecord 3.0.3,activerecord-sqlserver-adapter gem和ODBC连接.

sql-server primary-key rails-migrations ruby-on-rails-3

6
推荐指数
1
解决办法
1675
查看次数

Rails迁移错误

这看起来很简单,但我不确定会出现什么问题.

我试图在我的Rails迁移中执行以下操作:

change_column :foo, :bar, :text, :limit => 16777215
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `email_contents` text(16777215) DEFAULT '' NOT NULL
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一一个问题就是这个change_column是在我将列添加到foo之后不久发生的,并且必须首先将它从type:string更改为type:text.这些都来自他们自己的迁移脚本,如下所示:

add_column :foo, :bar, :string, :null => false
Run Code Online (Sandbox Code Playgroud)

change_column :foo, :bar, :text
Run Code Online (Sandbox Code Playgroud)

作为实验,我尝试更改第一个change_column(change_column:foo,:bar,:text)并发现这成功地改变了表格.遗憾的是,我无法更改以前的任何迁移,只能在当前的实现中添加新的迁移,因此无法在生产中使用.问题是,什么允许我更改一次但不是两次?

更新尝试了第一个建议,但得到以下内容:

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `bar` text(16777215) DEFAULT ''
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-migrations

6
推荐指数
1
解决办法
3716
查看次数

关于ActiveRecord Rails 3.1的迁移向下方法的截断表

up在迁移时的方法上定义了以下内容来设置初始数据:

  def up
    Color.create!({:id=>1,:name=>"",:color=>"FF6633"})
    Color.create!({:id=>2,:name=>"",:color=>"93B233"})
    Color.create!({:id=>3,:name=>"",:color=>"4D90D9"})
    Color.create!({:id=>4,:name=>"",:color=>"C43092"})
  end
Run Code Online (Sandbox Code Playgroud)

是否有任何truncate指令可以放在down方法上:

def down
   Color.truncate
end
Run Code Online (Sandbox Code Playgroud)

或者,因为我在创建时设置ID,我应该只使用destroy_all模型的方法Color吗?

activerecord truncate rails-migrations ruby-on-rails-3

6
推荐指数
2
解决办法
4272
查看次数

轨道中的外键4

我正在使用Rails 4和SQLite.我正在尝试在indicators表格中添加外键.请参阅下面的代码

class Indicator < ActiveRecord::Base
  belongs_to :objetive
  belongs_to :responsible, class_name: "Person"

end
Run Code Online (Sandbox Code Playgroud)

迁移脚本:

class AddFksToIndicator < ActiveRecord::Migration
  def change
      add_reference :indicators, :objective, index: true
      add_reference :indicators, :responsible, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

在运行迁移时一切正常,所以我尝试在控制台中:

2.0.0p247 :002 > i = Indicator.new
 => #<Indicator id: nil, name: nil, created_at: nil, updated_at: nil, objective_id: nil, responsible_id: nil> 
2.0.0p247 :002 > i.objective_id = 0
2.0.0p247 :003 > i.save
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,指标已保存,并且没有obectiveid = 0.

最后,我检查了指标表模式,得到:

CREATE TABLE "indicators" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT …
Run Code Online (Sandbox Code Playgroud)

sqlite ruby-on-rails foreign-keys rails-migrations ruby-on-rails-4

6
推荐指数
1
解决办法
1873
查看次数

使用自定义名称和外键引用

我在Rails 5上有一个User模型.

我想创建一个Book模型,引用User带有名称的模型author.我也想在迁移中设置外键.

在搜索答案时,我只找到了如何在迁移中添加列,而不是创建新表.下面的样子怎么样create_table :books

add_reference :books, :author, references: :users, index: true
add_foreign_key :books, :users, column: :author_id
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails foreign-keys rails-migrations ruby-on-rails-5

6
推荐指数
1
解决办法
2949
查看次数

有没有办法解决Rails删除的迁移?

我碰巧删除了迁移,我不想还原这些已删除的迁移.

这是rake db:migrate:status产生:

 Status   Migration ID    Migration Name
------------------------------------------------------

   up     0               ********** NO FILE *********
   up     20150209023430  Create users 
   up     20150320184628  ********** NO FILE **********
   up     20150322004817  Add roles to users
   up     20150403190042  ********** NO FILE **********
Run Code Online (Sandbox Code Playgroud)

rake db:migraterake db:rollback由于缺少文件,命令将无法工作.

我没有意图丢失我的数据,所以我不想使用rake db:droprake db:reset.

我能做些什么来执行迁移回滚以及如何摆脱丢失的文件?

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

6
推荐指数
2
解决办法
3593
查看次数

Rails:删除外键约束

我与用户和学期有以下关联。我创建了以学期ID作为外键的用户表。因此,如果不存在学期ID,则不会创建用户。但是在注册表格中,学期ID是可选的。

class User < ApplicationRecord
  belongs_to :semester
end
class Semester < ApplicationRecord
  has_many :users
end
    class CreateUsers < ActiveRecord::Migration[5.1]
      def change
        create_table :users do |t|
          t.string :email
          t.references :semester, foreign_key: true
          t.timestamps
        end
      end
    end
Run Code Online (Sandbox Code Playgroud)

那么,如何创建另一个迁移来删除外键约束呢?因此,在用户表中,我应该有两列email和semester_id,但semester_id不应具有外键约束,因为它是一个可选字段。

ruby-on-rails rails-migrations

6
推荐指数
2
解决办法
4116
查看次数