2012-11-30 12 views
6

W przypadku korzystania z tej opcji w config/application.rb:Jak rake db: migrować generować schema.rb przy użyciu: Format schematu sql

config.active_record.schema_format = :sql 

wtedy gdy zrobisz:

rake db:migrate 

to tylko zrzuca db/structure.sql. Wiem, że nie używa ona db/schema.rb, ponieważ używa ona opcji :sql, ale w jaki sposób można również wygenerować rake db:migrate generowanie db/schema.rb?

Potrzebujemy tego, ponieważ RubyMine 4.5 i IntelliJ IDea 11 używają db/schema.rb do autouzupełniania kolumn.

Odpowiedz

8

Aby wygenerować/aktualizację db/schema.rb nawet w przypadku korzystania z opcji :sql, można umieścić to w swoim Rakefile:

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

To powinno być dobre dla idei i rubymine.

Dla innych, którzy chcą tylko pliku referencyjnego, możesz zmienić nazwę na coś innego, na przykład db/schema.rb.backup, więc nie będzie to mylące. Aby to zrobić:

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 

(UWAGA: Korzystanie ../ w ścieżkach w Rakefile ponieważ __FILE__ ocenia na ścieżkę, która prowadzi w /Rakefile.)

+0

thx doskonały uczynek. Jedyną zmianą, którą muszę zrobić, jest plik o zmienionej nazwie, ponieważ czasami używam 'scaffold' (tego schematu wyszukiwania z wyrażeń regularnych //schema[ ^/]*.rb$). Zmieniam 'File.rename (File.expand_path (" ../ db/schema.rb ', __FILE__), File.expand_path ("../ db/schema.backup.rb', __FILE __))" – inye

Powiązane problemy