Musisz przejść z db/schema.rb
do db/structure.sql
.
Podstawowym problemem jest to, że schema.rb
jest reprezentacją struktury bazy danych, jaką widzi ActiveRecord, ale ActiveRecord nie rozumie wielu rzeczy (takich jak create type
, ograniczenia CHECK i inne rzeczy, które pojawiają się w execute some_raw_sql
w migracjach), które robi PostgreSQL. Możesz create type
wszystko co chcesz oprócz schema.rb
nigdy go nie zobaczę.
Jeśli chcesz użyć rzeczy, których ActiveRecord nie rozumie, musisz użyć db/structure.sql
do przechowywania struktury bazy danych. structure.sql
przechowuje strukturę bazy danych tak, jak rozumie ją baza danych, a nie tak, jak rozumie ją ActiveRecord.
Przełączanie jest łatwe:
- Zaktualizuj plik
config/application.rb
zawieraćconfig.active_record.schema_format = :sql
. - Wykonaj
rake db:structure:dump
aby uzyskać początkowydb/structure.sql
. - Usuń
db/schema.rb
z twojego drzewa katalogów i kontroli wersji. - Dodaj
db/structure.sql
do kontroli wersji. - Dostosuj swoje nawyki dotyczące prowizji:
- Użyj
db:structure:dump
zamiastdb:schema:dump
- Użyj
db:structure:load
zamiastdb:schema:load
- Użyj
To powiedziawszy, nie jestem pewien, jak dobrze natywny enum
PostgreSQL typy będą współdziałać z ActiveRecord, jak nigdy tego nie robiłem. enum
AR s
są tłumaczeniem po stronie klienta między ciągami i liczbami całkowitymi, ale enum
s
są obsługiwane w bazie danych i nie wiedzą o sobie nawzajem. Mogą wystąpić konflikty i musisz mieć pewność, że będą one ze sobą zsynchronizowane.