防止rails 5架构中create_table的"选项"

Pet*_*kas 5 tdd activerecord ruby-on-rails ruby-on-rails-5

我的Rails 5 schema.rb文件有options:每个部分create_table,我不想.我有的是:

  create_table "accounts", id: false, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

  create_table "accounts", id: false, force: :cascade do |t|
Run Code Online (Sandbox Code Playgroud)

由于这是一个生成文件,我不想手动编辑它.

我不想要这个options部分的原因是因为对于一个快速的TDD循环,我想在内存中使用SQLite RAILS_ENV=test但是MySQL在开发和生产中.

如何防止生成数据库适配器特定选项并将其放入架构中?

Til*_*ilo 2

Rails 5 打破了 Schema 转储格式

在 Rails 5 中,核心团队决定更改模式转储格式,新模式格式基本上存在两个问题:

1)create_table现在的语句具有options特定于适配器的语句,例如 OP 示例中的 MySQL。

:limit2)如果该值是列类型的默认值,则转储的列不会显示语句。

为什么这么糟糕?

1) ActiveRecord 应该与数据库无关,有些人使用架构文件将它们加载到不同类型的数据库中,例如将架构文件加载到 SQLite DB 中以加快测试速度。

SQLite 不理解 MySQL 的特定选项,并且崩溃得很惨。

2) 同一类型数据库的不同版本之间的限制可能会随着时间的推移而发生变化,并且当您从一个数据库转到另一个数据库时,限制肯定会发生变化。

因此,不显示“默认”限制的实际值并不是一个好主意。

解决方法

对 ActiveRecord 进行猴子修补是一个糟糕的主意。我讨厌必须这样做,但这是让我们的架构文件恢复到与数据库无关的状态的最简单方法,因此我们可以使用 SQLite 进行测试。

如果您要从 MySQL on Rails 5.0 转储架构,则可以通过将这两个文件添加到 Rails 5.0 项目来修复它:

配置/初始化程序/active_record/schema_dumper.rb

配置/初始化程序/active_record/connection_adapters/abstract/schema_dumper.rb

这两个文件包含 Rails 5-0-stable 分支的原始代码,稍作修改以不执行 (1) 和 (2)。

它并不漂亮,但它会让您生成与以前相同的转储格式。

希望核心团队能够尽快解决这个问题。

如果您有更好的解决方案,允许跨数据库使用模式文件,请评论或发布更好的解决方案。我真的不太喜欢猴子补丁:-(