标签: rails-migrations

Rails 3.2:从另一个迁移中调用\ down

我想以类似于生成器的方式调用另一个迁移.基本上,如果您有一个创建表,那么在将来的某个时间点,您将不再使用该表,并且您希望迁移进行调用,up并且down与原始创建迁移的迁移完全相反.如果有可能那么我会创建一个类似的生成器

rails g reverse_migration CreateModel
Run Code Online (Sandbox Code Playgroud)

然后结果是这样的

class ReverseCreateModel < ActiveRecord::Migration
  def up
    #call to create model down
  end
  def down
    #call to create model up
  end
end
Run Code Online (Sandbox Code Playgroud)

我不想要任何解决方法,而是明确地重复代码并保持干净迁移和角色的能力.

任何帮助将不胜感激!

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

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

使用带有2个尾随数字的十进制数进行迁移

Rails 3.2
MySQL gem
Run Code Online (Sandbox Code Playgroud)

我在迁移中有以下内容:

t.decimal :pre_tax_total, default: nil, scale: 2
t.decimal :post_tax_total, default: nil, scale: 2
Run Code Online (Sandbox Code Playgroud)

根据我读到的内容,scale:2将产生一个带有2个尾随数字的小数.

当我运行迁移,并查看表结构时,我看到以下内容:

pre_tax_total   decimal(10,0) 
post_tax_total  decimal(10,0)
Run Code Online (Sandbox Code Playgroud)

这意味着MySQL服务器会截断这些值.将这些列创建为十进制(10,2)的ActiveRecord语法是什么?

activerecord ruby-on-rails rails-migrations

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

测试迁移未与我的 Rails 引擎一起运行,即使指定了 `maintain_test_schema!`

我正在开发一个 Rails 引擎(插件)。到目前为止我有

  • 将 RSpec 设置为框架
  • 添加了一个迁移以创建一个名为的模型/表 MyJob
  • 在下面添加了一些基本模型测试 spec/models/my_job_spec.rb

rails 模板会自动创建一个spec/dummy应用程序,因此我执行以下操作来运行我的测试

# Create the development and test DBs
rake db:create

# Copy migrations over to my dummy app
cd spec/dummy
rake my_app:install:migrations
cd ../..

# Run specs
rspec spec/models/my_job_spec.rb
Run Code Online (Sandbox Code Playgroud)

但是,当我运行规范时,出现错误:

> rspec spec/models/
/Users/jeeves/.rvm/gems/ruby-2.2.2@gb/gems/activerecord-5.1.0/lib/active_record/migration.rb:576:in `check_pending!':  (ActiveRecord::PendingMigrationError)

Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

我认为这会自动发生,因为rails_helper.rb我肯定有以下内容,这应该为我维护我的测试模式

ActiveRecord::Migration.maintain_test_schema!
Run Code Online (Sandbox Code Playgroud)

它与插件或引擎的工作方式不同吗?

编辑:我尝试了运行bin/rails db:migrate RAILS_ENV=test, insidespec/dummy/然后重新运行的建议rspec spec/。仍然没有运气。

rspec ruby-on-rails rails-models rails-migrations rails-engines

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

由于外键类型,Rails 模型生成失败

我使用以下命令创建了一个模型:

rails g model UserCertification user:references certification:references certification_no:string
Run Code Online (Sandbox Code Playgroud)

这是参考我的设计用户模型user:references

在 db:migrate 我收到以下错误: 引起:

ActiveRecord::MismatchedForeignKey:user_iduser_certifications上的列idusers类型为 的列不匹配bigint(20)。要解决此问题,请将user_id列的类型更改 user_certifications为 :bigint。(例如 t.bigint :user_id)。原消息:Mysql2::Error:无法添加外键约束

这是我的迁移

class CreateUserCertifications < ActiveRecord::Migration[6.0]
  def change
    create_table :user_certifications do |t|
      t.references :user, null: false, foreign_key: true
      t.references :certification, null: false, foreign_key: true
      t.string :certification_no

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

我试图将类型设置为整数 t.references :user, null: false, foreign_key: true,type: :integer

我还删除了模型并重新编辑并检查了以前的参考资料,但没有成功。也许有人有想法?

ruby-on-rails rails-migrations ruby-on-rails-6

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

增加 Rails 迁移的语句超时

我的应用程序 rails 应用程序在生产中将 postgres 语句超时设置为 5 秒。这个超时对我们很有效,帮助我们捕捉生产中的错误,终止错误的查询等。但是,当我们部署更改时,我们有时希望运行需要超过 5 秒的数据迁移,并且经常遇到残酷的PG::QueryCanceled: ERROR: canceling statement due to statement timeout. 因此,我们正在寻找一种方法,将迁移的语句超时时间增加到约 10 分钟。做这个的最好方式是什么?

以下是我们所经历的选项以及我们对其中任何一个都不满意的原因。

1) 在您认为可能有问题的每个单独迁移中增加语句超时。-> 通常,开发人员会忘记或无法估计这需要多长时间。如果他们搞砸了,我们最终会出现部署失败、挑选等问题。

2)使用Task.enhance for db:migrate(或其他方法)增加每个任务前的语句超时时间。-> 使用增加语句超时很容易,ActiveRecord::Base.connection.execute 'SET statement_timeout = 600000'但这仅适用于现有连接。事实证明,当您运行时rake db:migrateActiveRecord实际上会打开一个新的数据库连接,该连接将恢复为现有的默认值。

3) Monkey 修补了实际的迁移方法,以在创建连接后设置语句超时。-> 请参阅下面的代码,它并不漂亮,并且使用 ActiveRecord 内部函数可能会产生我们不知道的后果。

# See here for overriding static methods: 
# /sf/ask/638996081/

# We need to override this method because immediately before this the database connection gets reset
# Override when we are running normally
# …
Run Code Online (Sandbox Code Playgroud)

postgresql activerecord ruby-on-rails rails-migrations

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

为什么我不能在Rails中的表中创建数组作为列?

为什么我不能这样做:

class CreateModels < ActiveRecord::Migration
  def self.up
    create_table :fruit do |t|
      t.array :apples
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

是否有其他方法可以使数组("apples")成为Fruit类实例的属性?

ruby arrays ruby-on-rails rails-migrations

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

如何设置迁移的当前"版本号"?

我有一堆迁移,但由于一些奇怪的原因,rails突然忘记它已经运行了大部分.现在,当我尝试运行时rake db:migrate,rails将尝试运行所有迁移.

如何设置当前的"版本号"或其中的任何名称,以便rails知道"哦,我已经运行了前5次迁移,我应该从第6次迁移开始"

rake ruby-on-rails rails-migrations

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

你能在Rails迁移中创建一个"临时"模型吗?

我有一个Rails 2项目,通过连接表有很多关系.让我们把表A,B,和ABJ,其中ABJ具有性能a_idb_id(连同不相干到这-问题id{created,updated}_at).

我想做的事

不幸的是,这种关系从一开始就被错误地创建,应该只是一个多(A has_many B's,B belongs_to A).所以我创建了一个向上迁移,将B直接重新关联到A. 基本上,1)add_column a_id到B,2)为每个ABJ,把abj.a.id放到abj.b.a_id,3)drop_table:abj.这很好用.

我还在向下迁移中创建了"逆"操作,如果我需要为每个B创建(1)create_table abj,2),则创建一个新的abj,使得abj.a_id = b.a_id和abj.b_id = b .id,3)从B)中删除_column a_id.这也很好.

问题

随着"重新关联"这种关系与一个多的关系,期望不再使用的连接资源ABJ将消失,即删除模型,控制器,测试等.问题是,如果我这样做需要返回,运行向下迁移将无法工作,因为在步骤2(对于每个B,创建一个新的abj),class ABJ < ActiveRecord::Base自从我删除模型后就不再有了.

那么,为了操纵数据库中的数据,有没有办法在迁移中制作"临时"模型?或者您是否只是要求运行迁移的人在运行之前确定该模型是否存在?因为如果在步骤2中向下迁移失败,则步骤1已经创建了abj表,然后您必须手动删除它或在迁移中注释掉第1步代码,然后再次运行它(然后取消注释它) ).

想知道是否有任何好的解决方案.

model ruby-on-rails rails-migrations

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

从Rails 1.2.3应用程序升级时如何更新迁移?

我正在将Rails 1.2.3应用更新到3.2.1.

我试图找出如何更新迁移结构以与最新版本的Rails兼容,这样理想情况下,您可以rake db:migrate在设置应用程序时运行.目前,我通过执行rake db:migrate:up VERSION=[version_number]我需要运行的任何迁移来解决这个问题.如果我只是运行rake db:migrate,它会尝试从一开始就重新运行所有迁移并停止(因为那些迁移已经在我拥有的db转储中运行).

应用程序中的迁移看起来像这样001_add_some_model.rb,002_add_some_other_model.rb而不是20120209182512_add_some_model.rb.

有人对这个有经验么?我怎样才能解决这个问题?

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

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

Rails 4迁移| 添加带参考的表

我正在尝试创建一个 Collaboration在我的Rails 4项目中表,但我遇到了一个问题.我希望它属于单个用户,合作者.

我运行以下命令来生成模型和迁移,我也在下面复制了它.

rails generate model Collaboration project:references collaborator:references accepted:boolean
Run Code Online (Sandbox Code Playgroud)

移民:

class CreateCollaborations < ActiveRecord::Migration
    def change
        create_table :collaborations do |t|
            t.references :project, index: true, foreign_key: true
            t.references :collaborator, index: true, foreign_key: true
            t.boolean :accepted

            t.timestamps null: false
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

模型:

class Collaboration < ActiveRecord::Base
    belongs_to :project
    belongs_to :collaborator, class_name: 'User'
end
Run Code Online (Sandbox Code Playgroud)

我更新了Collaboration模型,, class_name: 'User'如上所示.同样,我更新了现有Strategy模型以包含ahas_many :collaborations

class Project < ActiveRecord::Base
    has_many :collaborations
end
Run Code Online (Sandbox Code Playgroud)

当我运行时rake db:migrate,我收到以下错误报告.

rake aborted!
StandardError: An error …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails associations rails-migrations rails-activerecord

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