gpt4 book ai didi

ruby-on-rails - 防止 "options"在 rails 5 模式中创建表

转载 作者:行者123 更新时间:2023-12-04 21:09:03 25 4
gpt4 key购买 nike

我的 Rails 5 schema.rb文件有一个 options:每个部分create_table我不想要。我所拥有的是:

  create_table "accounts", id: false, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|

但我想要的是:
  create_table "accounts", id: false, force: :cascade do |t|

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

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

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

最佳答案

Rails 5 打破了 Schema 转储格式

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

1) create_table报表现在有 options这是特定于适配器的,例如OP 示例中的 MySQL。

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

为什么那么糟糕?

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

SQLite 不了解 MySQL 的特定选项,并且很糟糕。

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

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

解决

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

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

config/initializers/active_record/schema_dumper.rb

config/initializers/active_record/connection_adapters/abstract/schema_dumper.rb

这两个文件包含来自 Rails 5-0-stable 分支的原始代码,稍微修改为不做 (1) 和 (2)。

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

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

如果您有更好的解决方案,允许跨数据库使用架构文件,请评论或发布更好的解决方案。
我真的不是猴子补丁的忠实粉丝:-(

关于ruby-on-rails - 防止 "options"在 rails 5 模式中创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38878964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com