2011-10-28 14 views
9

में कस्टम डेटाबेस प्रकार मैं PostgreSQL 9.1 और earthdistance module के साथ रेल 3.1.1 का उपयोग कर रहा हूं। अलग-अलग स्थानों के बीच की दूरी की गणना करने में सक्षम होने के लिए, मैंने earth के साथ branches तालिका में एक कॉलम सेट किया है।ActiveRecord

समस्या अब मैं का सामना कर रहा हूँ कि मेरी रेल आवेदन इस तालिका का उपयोग करता है पृथ्वी प्रकार नहीं समझती है और इस तरह मैं इस हो रही है मेरी db/schema.rb:

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

इस के बाद से अब मैं कर सकते हैं 'समस्याग्रस्त है schema.rb से मेरा परीक्षण डेटाबेस नहीं बनाओ।

मैं इस प्रकार को एआर में कैसे जोड़ सकता हूं या इसे उस कॉलम को अनदेखा कर सकता हूं?

+1

मिले प्रश्न यहाँ का जवाब: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –

+7

यह उपयोगी है करने के लिए दूसरों एक जवाब को लिखने के लिए करने के लिए भी अपना स्वयं का प्रश्न और स्वीकार करें। यह अनुत्तरित सूची के इस प्रश्न को भी बंद करता है। – Nick

उत्तर

5

इस प्रयास करें:

बदलें आप config/application.rb

config.active_record.schema_format = :sql 

यह देशी PostgreSQL एसक्यूएल प्रारूप करने के लिए उत्पादन प्रारूप बदल जाएगा, schema.rb अक्षम हो जाएगा और एक नई फ़ाइल होगा उत्पन्न /db/config/structure.sql

+0

मैंने यह कोशिश की, लेकिन रेल 'डीबी: स्कीमा: लोड' अभी भी' schema.rb' फ़ाइल की तलाश में प्रतीत होता है। –

+0

ऐसा लगता है कि आपको 'रेक डीबी: संरचना: लोड'' का उपयोग करना होगा। –

5

एक और मामला जहां कोई इसमें भाग ले सकता है वह पोस्टग्रेस्क्ल में अपने कस्टम पोस्टग्रेस प्रकार (enums) डालने पर होता है। यदि कोई ऐसा करता है और अभी भी आपकी schema.rb के लिए रूबी का उपयोग करना चाहता है, तो आप एडाप्टर की मान्य प्रकारों की सूची में कस्टम डेटाबेस प्रकार जोड़ सकते हैं।

उदाहरण के लिए, मान लें कि आपके पास address_type और 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 

फिर में एक प्रारंभकर्ता बनाते समय या अपने application.rb को कुछ इस तरह जोड़ें:

  • मैं PostgreSQLAdpater क्योंकि के अस्तित्व जाँच कर रहा हूँ:

    मेरी समाधान के बारे में
    # 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 
    

    नोट्स एक स्थिर विश्लेषण मणि जिस तरह से मैं आंशिक रूप से कुछ एआर निर्भरताओं को लोड करता हूं - विशेष रूप से मणि annotate

  • मूल परिभाषा is here के लिए स्रोत। इस में मेरे चल पर

पृष्ठभूमि: जब यह रेल 5.0.x में मुझे क्या हुआ, माइग्रेशन ठीक भाग गया, लेकिन फिर अपने परीक्षण वातावरण जब db:test:prepare या db:reset चलाने का प्रयास विफल हो जाएगा। स्कीमा डंप मुद्दे पर इसे ट्रैक करने में मुझे काफी समय लगा।

+0

यह रेल 4.2.8 में मेरे लिए काम नहीं कर रहा है, क्या कोई अन्य फॉर्मूलेशन है जिसका उपयोग करने की ज़रूरत है? –

+0

क्या आप अपनी दौड़ में आने वाली त्रुटि पर अधिक जानकारी साझा कर सकते हैं और शायद अपना कोड एक गलियारे में डाल सकते हैं और मुझे देख सकते हैं? –

+0

मैंने जो कुछ लिखा है, वह मैंने भाग लिया है और यह 5.0.1 या तो – Kasumi