当使用:sql模式格式时,如何使rake db:migrate生成schema.rb?

10

如果在 config/application.rb 中使用此选项:

config.active_record.schema_format = :sql

然后当你执行:

rake db:migrate

它只会转储db/structure.sql。我知道它没有使用db/schema.rb,因为它正在使用:sql选项,但是如何使rake db:migrate也生成db/schema.rb呢?

我们需要这个是因为RubyMine 4.5和IntelliJ IDEA 11使用db/schema.rb来自动完成列。

2个回答

10

即使使用:sql选项,也可以生成/更新db/schema.rb,您可以将以下内容放入您的Rakefile中:

Rake::Task["db:migrate"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end

这对于 IDea 和 RubyMine 应该是可以的。

对于其他只需要该文件作为参考的人,您可能希望将其重命名为其他名称,例如 db/schema.rb.backup,以免产生混淆。 如何操作:

Rake::Task["db:migrate"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
    File.rename(File.expand_path('../db/schema.rb', __FILE__), File.expand_path('../db/schema.rb.backup', __FILE__))
  end
end

(注意:在Rakefile的路径中使用../,因为__FILE__的值以/Rakefile结尾。)


谢谢,工作完美。我唯一需要更改的是重命名文件,因为有时我使用scaffold(这将使用正则表达式//schema[^/]*.rb$搜索模式)。我将更改File.rename(File.expand_path('../db/schema.rb', __FILE__), File.expand_path('../db/schema.backup.rb', __FILE__)) - inye

1

为了让这个对我起作用,我不得不像这样夹着调用:

ActiveRecord::Base.schema_format = :ruby
Rake::Task["db:schema:dump"].invoke
ActiveRecord::Base.schema_format = :sql

感谢Gary的建议。


这是用Rails7吗?据我所知,在Rails7中这个领域有一些变化。 - mu is too short
我不确定Rails 7中的更改是否有助于重塑解决方案...根据我在这里阅读到的内容:https://blog.saeloun.com/2022/08/30/rails-db-schema-supports-schema-format-env/ - cyrusg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接