2011-10-28 23 views
9

Używam Rails 3.1.1 z PostgreSQL 9.1 i earthdistance module. Aby poprawnie obliczyć odległość między różnymi lokalizacjami, ustawiłem kolumnę z typem earth w mojej tabeli branches.Niestandardowy typ bazy danych w ActiveRecord

Problem mam przeżywa teraz jest to, że moja aplikacja Rails który używa tej tabeli nie rozumie rodzaj ziemi, a więc jestem coraz to w moim db/schema.rb:

# Could not dump table "branches" because of following StandardError 
# Unknown type 'earth' for column 'location'

Jest to problematyczne, ponieważ teraz mogę” t utworzyć testową bazę danych z pliku schema.rb.

Jak dodać ten typ do AR lub zmusić go do zignorowania tej kolumny?

+1

znaleźć odpowiedź na pytanie tutaj: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –

+7

Jest to pomocne dla innych, aby napisać odpowiedź nawet własne pytanie Zaakceptuj to. To również bierze tę kwestię z listy bez odpowiedzi. – Nick

Odpowiedz

5

Spróbuj tego:

cię zmienić config/environment.rb

config.active_record.schema_format = :sql 

Będzie to zmienić format wyjściowy do natywnego formatu PostgreSQL SQL schema.rb zostaną wyłączone, a nowy plik zostanie być generowane /db/config/structure.sql

+0

Próbowałem tego, ale rails 'db: schema: load' nadal wydaje się szukać pliku' schema.rb'. –

+0

Wygląda na to, że zamiast tego musisz użyć 'rake db: structure: load'. –

5

Innym przypadkiem, w którym ktoś może się na to natknąć, jest wstawianie niestandardowych typów postgresów (wyliczeń) do postgresql. Jeśli to się robi i nadal chce używać Ruby do swojego schematu.rb, możesz dodać niestandardowe typy baz danych do listy poprawnych typów adaptera.

Na przykład, powiedzmy, że masz migrację podobną do tej z address_type i address_status.

class CreateAddresses < ActiveRecord::Migration 
    def up 

    execute <<-SQL 
     CREATE TYPE address_status AS ENUM ('active', 'archived'); 
     CREATE TYPE address_type AS ENUM ('billing', 'shipping'); 
    SQL 

    create_table :customer_addresses do |t| 
     # bla bla 
     t.column :address_type, :address_type 
     t.column :status, :address_status 

     t.timestamps null: false 
    end 
    end 

    def down 
    drop_table :customer_addresses 
    execute <<-SQL 
     DROP TYPE address_type; 
     DROP TYPE address_status; 
    SQL 
    end 

end 

Następnie w stworzenie inicjator lub dodać coś takiego do environment.rb:

# config/initializers/postres_enum_custom_types.rb 
module ActiveRecord 
    module ConnectionAdapters 
    if const_defined?(:PostgreSQLAdapter) 
     class PostgreSQLAdapter 
     NATIVE_DATABASE_TYPES.merge!(
      address_status: { name: 'character varying' }, 
      address_type: { name: 'character varying' } 
     ) 
     end 
    end 
    end 
end 

Uwagi o moim roztwór:

  • jestem sprawdzanie istnienia PostgreSQLAdpater ponieważ sposobu, w jaki klejnot do analizy statycznej, którego używam, częściowo ładuje niektóre zależności AR - szczególnie klejnot annotate.
  • Źródło oryginalnej definicji is here.

tło na moim komputerze jest uruchomiona na to: Kiedy to się stało ze mną w Rails 5.0.x, migracje pobiegł w porządku, ale potem moje środowisko testowe nie powiedzie się podczas próby uruchomienia db:test:prepare lub db:reset. Zajęło mi trochę czasu, aby śledzić to do problemu schema dump.

+0

To nie działa dla mnie w Railsach 4.2.8, czy jest jeszcze jakieś inne sformułowanie, którego potrzebuję użyć? –

+0

Czy możesz udostępnić więcej informacji na temat błędu, na który natknąłeś się, a może umieścić swój kod w mgnieniu oka i spojrzeć na mnie? –

+0

Przebiegłem dokładnie to, co wpisałeś i nie działa ono w wersji 5.0.1 ani – Kasumi

Powiązane problemy