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

问题描述 投票:0回答:2

如果在

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
自动完成列。

ruby ruby-on-rails-3 rake dbmigrate schema.rb
2个回答
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

对于 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
结尾的路径。)


0
投票

为了让这个对我有用,我不得不像这样把电话夹在中间:

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

感谢加里的建议。

© www.soinside.com 2019 - 2024. All rights reserved.