2011-10-28 6 views
9

私はPostgreSQL 9.1とearthdistance moduleでRails 3.1.1を使用しています。 異なる場所間の距離を適切に計算できるように、branchesテーブルにearthタイプの列を設定しました。ActiveRecordのカスタムデータベースタイプ

私が今経験しています問題は、このテーブルを使用して、私のRailsアプリケーションは、地球のタイプを理解していないので、私はこれを取得していますということです私のdb/schema.rb

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

これは「今私ができるので、問題がありますschema.rbからテストデータベースを作成しないでください。

このタイプをARに追加したり、そのカラムを無視するにはどうすればよいですか?

+1

ここでの質問への答えが見つかりました: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –

+7

はそれも、あなた自身の質問への答えを書き出すために他の人に便利だし、受け入れ。それはまた、未回答のリストからこの質問を取り除く。 – Nick

答えて

5

はこれを試してみてください。これは、ネイティブのPostgreSQL SQL形式に出力形式を変更しますあなたが設定/ application.rb

config.active_record.schema_format = :sql 

変更は、schema.rbが無効になり、新しいファイルがします生成される/db/config/structure.sql

+0

私はこれを試しましたが、 'db:schema:load'は' schema.rb'ファイルを探しています。 –

+0

代わりに 'rake db:structure:load'を使わなければならないようです。 –

5

これに遭遇する別のケースは、カスタムのpostgresタイプ(列挙型)をpostgresqlに挿入する場合です。これを実行しても、あなたのschema.rbにRubyを使用したい場合、カスタムデータベース型をアダプタの有効な型のリストに追加することができます。

たとえば、address_typeaddress_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 

を作成したりapplication.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 

注:

  • 私はのでPostgreSQLAdpaterの有無をチェックしています私が使用している静的解析の宝石は、いくつかのAR依存性を部分的にロードします。具体的には、宝物annotateです。
  • 元の定義のソースis here。この中に私のランニングに

背景:これはレールの5.0.xで私に起こった、移行は細かい走ったが、db:test:prepareまたはdb:resetを実行しようとすると、その後私のテスト環境では失敗します。これをスキーマダンプの問題にまで追跡するのにかなり時間がかかりました。

+0

これはRails 4.2.8で動作しません。使用する必要のある他の形式がありますか? –

+0

あなたが実行しているエラーの詳細を分かち合い、おそらくあなたのコードを要点に置き、それを私に見せてもらえますか? –

+0

入力した内容が正確に実行されていて、5.0.1でも動作していません – Kasumi