2011-12-08 38 views
6

मेरे पास दो अलग-अलग स्कीमा जैसे दो टेबल हैं cases और eventsरेल पोस्टग्रेस्क्ल एकाधिक स्कीमा और एक ही तालिका का नाम

प्रत्येक स्कीमा में मैं मेज बुनियादी है

  • events.basic
  • cases.basic

यह टेबल संबंध:

  • events.basic है एक cases.basic (cases.basic कई events.basic है)

मेरे प्रयास विफल रहे हैं:

फ़ाइल cases_basic.rb

class CasesBasic < ActiveRecord::Base 
    set_table_name 'cases.basic' 
    set_primary_key 'case_id' 
    has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id' 
end 

फ़ाइल events_basic.rb

class EventsBasic < ActiveRecord::Base 
    set_table_name 'events.basic' 
    set_primary_key 'event_id' 
    belongs_to :Case, :class_name => 'CasesBasic', :foreign_key => 'case_id' 
end 

पर्यावरण: रूबी 1.9.3, रेल 3.1.3, gem 'pg'

मैं इस सवाल का जवाब देने के लिए की आवश्यकता है:

  1. कैसे रेल सक्रिय रिकॉर्ड में इस स्थिति से निपटने के लिए?
  2. इस तालिका को कैसे क्वेरी करें?
  3. कैसे में rake db:schema:dump

संपादित इस स्थिति को संभालने के लिए:

belongs_to और has_many बदलने के बाद (जैसे सन्नाटा सुझाव है) मैं एक ही त्रुटि है

PGError: ERROR: column basic.case_id does not exist 
LINE 1: ...IN "cases"."basic" ON "cases"."basic"."case_id" = "events"."... 
                  ^
: SELECT "events"."basic".* FROM "events"."basic" INNER JOIN "cases"."basic" ON "cases"."basic"."case_id" = "events"."basic"."case_id" LIMIT 3 

रेल बुरा उत्पन्न एसक्यूएल। मुझे कुछ उपनामों का उपयोग करके किया जाना चाहिए:

"घटनाओं" से चुनें। "मूल" टी 1 इनरर जॉइन "मामलों"। "मूल" टी 2 ऑन टी 1। "Case_id" = t2। "Case_id" LIMIT 3


संपादित करें 2: ठीक है यह मेरा च *** बग, मैं अपने उदाहरण डेटाबेस में events.basic.case_id स्तंभ और विदेशी कुंजी जोड़ने नहीं किया। यह काम करता है!


प्रश्न 1 और 2 काम कर रहे हैं, लेकिन हम के बारे में सवाल है rake db:schema:dump इसके बारे में क्या? रेल केवल सार्वजनिक स्कीमा के लिए मॉडल उत्पन्न करता है।

मेरे पास इतनी सारी टेबल और रिश्तों हैं जो मैं उन्हें उत्पन्न करना चाहता हूं।

+0

आपका ': ईवेंट' और 'केस' शायद ': ईवेंट' और 'केस' होना चाहिए, लेकिन शायद यह ठीक नहीं होगा। –

+0

@muistooshort ': घटनाक्रम 'और' केस 'एलियास की तरह दिखता है और इस मामले में एसक्यूएल में नहीं लिया जाता है –

+0

मैं टेबल की तरह दिखने के बारे में थोड़ा उलझन में हूं,' चालू" मामलों को क्या करना चाहिए। "मूल" "case_id" = "घटनाएं"। "मूल"। "case_id" 'स्थिति में शामिल होने की तरह दिखता है? तालिकाओं में से एक में 'case_id' नहीं है और यह एक समस्या है, अगर आप इसे हाथ से कर रहे थे तो आप उस स्थिति में कैसे शामिल होंगे? –

उत्तर

1

चेक बाहर http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

यह वर्णन करता है एकाधिक स्कीमा के साथ एक Postgres डेटाबेस का उपयोग करने के लिए एक रेल आवेदन को कॉन्फ़िगर कैसे करें। वह यूनिक्स पथ की कार्यक्षमता के लिए टेबल लुकअप की तुलना करता है, विशिष्ट स्थानों से शुरू होता है, और सामान्य स्थानों पर वापस आ जाता है।

एक बार आपके स्कीमा पथ एकीकृत किए जाने के बाद, आप इन तालिकाओं को सफलतापूर्वक क्वेरी कर सकते हैं। डीबी: स्कीमा: डंप उसी स्कीमा प्राथमिकता का उपयोग करके टेबल पढ़ेगा जो आपका एप्लिकेशन पसंद करता है।

+1

उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्यवश यह समस्या हल नहीं कर रहा है, लेखक का उपयोग 'SET SEARCH_PATH से schema1, schema2' दृष्टिकोण जो सरल डेटाबेस के लिए बहुत अच्छा है जब आपको विभिन्न स्कीमा में तालिकाओं के बीच संबंधों की आवश्यकता नहीं होती है, और यह कई स्कीमा समस्या को हल नहीं करता है , आप एक ही नाम के साथ तालिकाओं में शामिल नहीं हो सकते हैं। और मेरे सिस्टम में 300 टेबल हैं, जिनमें से कई के समान नाम हैं। –

1

[संपादित करें: आगे पढ़ने के बाद, मुझे नहीं लगता कि ActiveRecord कई स्कीमा का समर्थन करता है। लेकिन मुझसे गलती हो सकती है। मैं इस उत्तर को समय के लिए यहां छोड़ दूंगा, हालांकि यह लगभग निश्चित रूप से गलत है। (संकल्पनात्मक यह सही है। लेकिन जिन लोगों ने ActiveRecord बनाया है, वे शायद किसी भी डेटाबेस लोगों से बात नहीं करते हैं, क्योंकि डेटाबेस लोगों को क्या पता चलेगा?) ऐसा लगता है कि 2008 में आईबीएम इस समस्या पर काम कर रहा था, लेकिन मुझे नहीं लगता यह काम कैसे समाप्त हुआ।]

PostgreSQL को अलग-अलग स्कीमा में समान नाम वाले टेबलों के विदेशी कुंजी संदर्भों में कोई समस्या नहीं है। कोड

class CasesBasic < ActiveRecord::Base 
    set_table_name 'cases.basic' 
    set_primary_key 'case_id' 
    has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id' 
end 

शायद स्कीमा-योग्य होने की आवश्यकता है।

अब, यह सच नहीं है कि तालिका के मामलों। बेसिक "कई" घटनाएं हैं, है ना? नहीं, यह "कई" घटनाओं है। बेसिक। अपने दो वर्गों में उस तरह के परिवर्तन को ले जाएं, और हमें बताएं कि यह कैसे काम करता है। (यहां कोई रेल नहीं है, या मैं आपके लिए इसका परीक्षण करूंगा।)

+0

"लेकिन जिन लोगों ने ActiveRecord बनाया है, वे शायद किसी डेटाबेस डेटाबेस से बात नहीं करते हैं, क्योंकि डेटाबेस लोगों को क्या पता चल सकता है?" डीबी लोगों को मूर्खतापूर्ण अखंडता जैसे मूर्ख चीजों के बारे में पता है (जो रेल सोचता है कि एक आवेदन मुद्दा है)। रेलों में इसमें बहुत अच्छे विचार हैं, ActiveRecord उनमें से एक नहीं है। –

+0

@muistooshort: और स्कीमा। –

+0

और जांच बाधाएं, फ़ंक्शन इंडेक्स, ट्रिगर, और कुछ और, जो कहें, MySQL3 समझ में नहीं आया। –

1

मैं pg_power gem का उपयोग करने की सलाह दूंगा। यह इस तरह से माइग्रेशन में PostgreSQL स्कीमा बनाने के लिए वाक्यविन्यास प्रदान करता है:

def change 
    drop_schema 'demography' 
    create_schema 'politics' 
end 

और यह भी सही ढंग से schema.rb फ़ाइल में स्कीमा डंपिंग के बारे में ख्याल रखता है।

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