如何使用rake db:migrate生成schema.rb时使用:sql架构格式

Gar*_*ver 9 ruby rake dbmigrate schema.rb ruby-on-rails-3

如果在以下位置使用此选项config/application.rb:

config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

然后当你这样做:

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

它只会转储db/structure.sql.我知道它没有使用,db/schema.rb因为它正在使用该:sql选项,但你怎么能rake db:migrate生成db/schema.rb呢?

我们需要它,因为RubyMine 4.5和IntelliJ IDea 11 db/schema.rb用于自动完成列.

Gar*_*ver 10

要生成/更新db/schema.rb即使使用该:sql选项,您也可以将其放入Rakefile:

Rake::Task["db:migrate"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end
Run Code Online (Sandbox Code Playgroud)

这对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
Run Code Online (Sandbox Code Playgroud)

(注意:../在路径中使用Rakefile因为__FILE__评估结束的路径/Rakefile.)