51

मेरे पास मेरे रेल एप्लिकेशन के लिए एक पोस्टग्रेएसक्यूएल डेटाबेस है। 'सार्वजनिक' नामक स्कीमा में मुख्य रेल मॉडल टेबल संग्रहित किए जाते हैं। मैंने एक 'डिस्कॉग' स्कीमा बनाया है जिसमें नामों के साथ तालिकाओं होंगे जो कभी-कभी 'सार्वजनिक' स्कीमा में समान होती हैं - जो कि कारणों में से एक है मैं इसे व्यवस्थित करने के लिए स्कीमा का उपयोग कर रहा हूं।रेल मॉडल के साथ एकाधिक पोस्टग्रेएसक्यूएल स्कीमा का उपयोग

मैं अपने ऐप में 'डिस्कॉग' स्कीमा से मॉडल कैसे सेट करूं? मैं इन मॉडलों को सोलर इंडेक्स को भी जाने के लिए सनस्पॉट का उपयोग करूँगा। मुझे यकीन है कि आप यह कैसे करेंगे।

+2

डीबी के माध्यम से डेटाबेस सेट करते समय कोई भी 'सार्वजनिक' स्कीमा कैसे बनाता है: रेक कार्य बनाएं? टेम्पलेट 1 डेटाबेस में स्कीमा जोड़ना एक संभावना है। लेकिन क्या सामान्य रेल/रेक विकास प्रक्रिया के हिस्से के रूप में इसे करने का कोई तरीका है? – TsenYing

+0

@TsenYing [pg_power मणि है] (http://stackoverflow.com/a/18227887/673826) इसके लिए एक विकल्प के रूप में। इसका [घर यहां है] (https://github.com/TMXCredit/pg_power)। हालांकि यह 2 साल के लिए अद्यतन नहीं किया गया है। * डीबी * नामस्थान में * निर्माण * रेक कार्य लिखने और वहां अपनी सामग्री जोड़ने के लिए एक और विकल्प हो सकता है। – mlt

उत्तर

82

डेटाबेस.एमएलएल में PostgreSQL एडाप्टर schema_search_path आपकी समस्या का समाधान करता है? ,

public_schema: 
    adapter: postgresql 
    encoding: utf-8 
    database: solidus 
    host: 127.0.0.1 
    port: 5432 
    username: postgres 
    password: postgres 
    schema_search_path: "public" 

discogs_schema: 
    adapter: postgresql 
    encoding: utf-8 
    database: solidus 
    host: 127.0.0.1 
    port: 5432 
    username: postgres 
    password: postgres 
    schema_search_path: "discogs" 

परिभाषित प्रत्येक कनेक्शन के बाद दो मॉडल बनाने:

development: 
    adapter: postgresql 
    encoding: utf-8 
    database: solidus 
    host: 127.0.0.1 
    port: 5432 
    username: postgres 
    password: postgres 
    schema_search_path: "discogs,public" 

या, आप कर सकते हैं प्रत्येक स्कीमा के लिए अलग अलग कनेक्शन निर्दिष्ट करने के लिए

class PublicSchema < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection :public_schema 
end 

class DiscoGsSchema < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection :discogs_schema 
end 

और, अपने सभी मॉडलों से विरासत संबंधित स्कीमा:

class MyModelFromPublic < PublicSchema 
    set_table_name :my_table_name 
end 

class MyOtherModelFromDiscoGs < DiscoGsSchema 
    set_table_name :disco 
end 

मुझे उम्मीद है कि यह मदद करता है।

+7

ऐसा लगता है कि आपको गैर-मौजूदा टेबल परेशानियों से बचने के लिए * स्कीमा कक्षाओं में self.abstract_class = true जोड़ना चाहिए। –

8

बस

class Foo < ActiveRecord::Base 
    set_table_name 'myschema.foo' 
end 
1

विधि set_table_name निकालें कर दिया गया है है। self.table_name ठीक काम है।

6

क्योंकि set_table_name हटा दिया गया था, और इसे self.table_name द्वारा प्रतिस्थापित किया गया था।

मुझे लगता है कि आप के रूप में पालन कोड चाहिए:

class Foo < ActiveRecord::Base 
    self.table_name 'myschema.foo' 
end 
7

माइग्रेशन में:

class CreateUsers < ActiveRecord::Migration 
    def up 
    execute 'CREATE SCHEMA settings' 
    create_table 'settings.users' do |t| 
     t.string :username 
     t.string :email 
     t.string :password 

     t.timestamps null: false 
    end 
    end 

    def down 
    drop_table 'settings.users' 
    execute 'DROP SCHEMA settings' 
    end 

end 

मॉडल

class User < ActiveRecord::Base 
    self.table_name 'settings.users' 
end 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^