如果在
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
自动完成列。
生成/更新
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
结尾的路径。)
为了让这个对我有用,我不得不像这样把电话夹在中间:
ActiveRecord::Base.schema_format = :ruby
Rake::Task["db:schema:dump"].invoke
ActiveRecord::Base.schema_format = :sql
感谢加里的建议。