2008-10-08 4 views
7

मेरे पास ऐसी स्थिति है जहां मेरे पास दो मॉडल, कंपनियां और अनुमतियां हैं, जहां कंपनियां मेरे अनुमति डेटाबेस से अलग डेटाबेस में हैं। यह एक है और कई रिश्तों से संबंधित है क्योंकि प्रत्येक कंपनी के पास कई अनुमतियां हो सकती हैं और प्रत्येक अनुमति कई कंपनियों से संबंधित हो सकती है।कई डेटाबेस के साथ कई रिश्ते हैं और

दो डेटाबेस विभाजित होने का कारण यह है कि कंपनी डेटाबेस उच्च मांग उत्पादन अनुप्रयोग चलाता है और अनुमति डेटाबेस किसी अन्य एप्लिकेशन के लिए अनुमतियों को नियंत्रित करता है।

रेल के साथ, यह प्राथमिक तालिका के समान डेटाबेस में शामिल तालिका की तलाश करता है। उदाहरण के लिए, यदि मैं company.permissions करता हूं, तो यह company_permissions के लिए कंपनी डेटाबेस में दिखता है। अगर मैं allow.companies करता हूं तो यह अनुमति डेटाबेस में दिखता है।

एकाधिक डेटाबेस के साथ कई रिश्तों का उपयोग करने का सबसे अच्छा समाधान क्या है?

उत्तर

5

कई और पुराने, घबराहट और समस्याग्रस्त हैं। मैं इसके बजाय has_many का उपयोग करने की सलाह देते हैं। आप ": through" विकल्प के साथ संबंध तालिका निर्दिष्ट कर सकते हैं; बस चुनें कि आप किस डेटाबेस में रहना चाहते हैं और इसका प्रतिनिधित्व करने के लिए एक मॉडल बनाएं। http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

+0

कारण यह है कि मैं इस उत्तर उठाया नीचे दिया गया अधिक पूरा उत्तर इसलिए है क्योंकि नीचे दिए गए उत्तर के साथ, आपको अभी भी किसी प्रकार का सिंक्रनाइज़ेशन करने की आवश्यकता है। इस विधि के साथ, आपको केवल टेबल नाम रूबी को बताने की आवश्यकता है। – Steropes

1

यदि कंपनियां डेटा अक्सर नहीं बदलती हैं, तो शायद आप डेटा को अनुमति डेटाबेस में सिंक्रनाइज़ कर सकते हैं, फिर स्वाभाविक रूप से शामिल हों। विरासत में मिला एक सीएमएस ऐसा कुछ कर रहा है जहां उपयोगकर्ता प्रमाणीकरण अपने डेटाबेस में है, और अनुमतियां और ऐसे सभी संग्रहीत हैं, और उपयोगकर्ता खाते प्रत्येक साइट के लिए स्थानीय डेटाबेस में synch'd हैं। इस तरह उपयोगकर्ता खातों को 1 लॉगिन के साथ कई साइटों पर साझा किया जा सकता है (विशेष रूप से प्रशासन के लिए)।

सबसे अच्छा नहीं हो सकता क्योंकि एक सिंच शामिल है। आदर्श रूप से यदि आप अनुमतियों को स्थानांतरित नहीं कर सकते हैं तो आपको केवल अनुमति डेटा डीबी में कंपनी डेटा स्टोर करना चाहिए। बेशक आप कंपनी पर कहीं और शामिल हो रहे हैं।

6

दिलचस्प सवाल। मेरे अपने संदर्भ के लिए, मुझे इस प्रश्न के संदर्भ में रेल पकाने की विधि पुस्तक में प्रस्तावित समाधान को सारांशित करने का प्रयास करें।

1) पहले डेटाबेस में जोड़ें।YML

permissions: 
    adapter: mysql 
    database: permissions 
    username: root 
    password: 
    socket: /tmp/mysql.sock 

2) बाहरी डेटाबेस

class Permission < ActiveRecord::Base 

    establish_connection :permissions 

end 

3 कॉल करने के लिए अनुमति मॉडल हैं) (विस्थापित) एक अनुमति संदर्भ तालिकाअनुमति Id स्तंभ

4) उपयोग के साथ अनुमति रिफरेंसके लिंक के रूप में मॉडल अनुमति मॉडल

class PermissionReference < ActiveRecord::Base 

    belongs_to :permission 
    has_and_belongs_to_many :companies, 
          :join_table => 'companies_permissions', 
          :foreign_key => 'permission_id' 

end 

5) अंत में सहयोगी अनुमति के लिए कंपनी

class Company < ActiveRecord::Base 

    has_and_belongs_to_many :permissions, 
          :class_name => 'PermissionReference', 
          :join_table => 'companies_permissions', 
          :association_foreign_key => 'permission_id' 

end 

आप मॉडल है कि एक बाहरी डेटाबेस कॉल उपवर्गीकरण द्वारा रिफैक्टरिंग पर विचार करना चाहते हो सकता है

class External < ActiveRecord::Base 

    self.abstract_class = true 
    establish_connection :permissions 

end 

class Permission < External 
end 
+0

यह उत्तर इस पृष्ठ के समान दिखता है: https://calshare.berkeley.edu/sites/AS/Web_Apps/ruby/Wiki%20Pages/Connecting%20to%20Multiple%20Databases.aspx – Steropes

+1

हाँ वह पृष्ठ मूल रूप से नुस्खा की एक प्रति है 15 रेल रेसिपी किताब में पाया गया जो मेरा जवाब आधारित था। :) – JasonOng