2011-09-12 12 views
8

मैं ActiveRecord मणि को नवीनतम 3.1.0 रिलीज़ में अपग्रेड करने और कई अपवादों को उठाए जाने का प्रयास कर रहा हूं, मुझे लगता है कि यह कई डेटाबेस को कैसे प्रबंधित करता है इसके कारण है।ActiveRecord 3.1.0 एकाधिक डेटाबेस

हमारे प्रत्येक डेटाबेस के लिए हम एक अलग बेस क्लास निर्दिष्ट करते हैं जो ActiveRecord::Base से प्राप्त होता है, और वहां establish_connection पर कॉल करें। कोई क्रॉस-डेटाबेस संबंध नहीं हैं। इसने अभी तक हमारे लिए ठीक काम किया है।

ActiveRecord 3.1.0 में अपग्रेड करने के बाद मैं देख रहा हूं कि यह ActiveRecord::ConnectionNotEstablished अपवाद के साथ विफल रहता है, जब संबंधों को पार करते समय (यानी यह सफलतापूर्वक एक इकाई को खींच लेता है या डीबी से सेट करता है, लेकिन संबंधित सेविगेट करते समय विफल रहता है कक्षा)।

बैकट्रैक की शीर्ष पंक्ति C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in 'retrieve_connection' है, इसलिए मैंने इसे थोड़ा खोला। विधि इस प्रकार परिभाषित किया गया है:

def retrieve_connection(klass) #:nodoc: 
    pool = retrieve_connection_pool(klass) 
    (pool && pool.connection) or raise ConnectionNotEstablished 
end 

मेरे साधारण परीक्षण (puts Customer.first.address) कॉल retrieve_connection 3 बार। Customer के साथ klass पैरामीटर के साथ दो बार, और एक बार पैरामीटर के रूप में ActiveRecord::Base के साथ - जो establish_connection के रूप में विफल होने पर ActiveRecord::Base के लिए कॉल नहीं किया गया है।

वास्तविक प्रश्न पर - क्या ActiveRecord में एकाधिक डेटाबेस कनेक्शन को संभालने का एक नया अनुशंसित तरीका है? यदि ऐसा है, तो ये क्या है?

यदि नहीं, तो इस समस्या का कारण क्या हो सकता है?

उत्तर

8

मैं ActiveRecord 3.1.0 में अपग्रेड करते समय कल एक ही समस्या में भाग गया। मैं ActiveRecord 3.1 में एकाधिक डेटाबेस कनेक्शन को संभालने का एक नया अनुशंसित तरीका नहीं बोल सकता हूं, लेकिन मुझे खुद को अनवरोधित करने का कोई तरीका मिला।

ऐसा लगता है कि अब एडाप्टर के तालिका नाम की लंबाई/नियम निर्धारित करने के लिए ActiveRecord :: Base पर एक कनेक्शन स्थापित होना चाहिए। मेरे डेटाबेस प्रारंभकर्ता में स्थापित मेरे बाकी कनेक्शन के साथ, अब मेरे पास एक डीबी में से एक को सक्रिय ActiveRecord :: बेस कनेक्शन भी स्थापित है (इससे कोई फर्क नहीं पड़ता)।

मुझे लगता है कि एक बेहतर समाधान मिलना है, लेकिन मुझे अभी अनब्लॉक करने में खुशी है।

+0

इसके लिए धन्यवाद, अभी तक इसे आजमाने का समय नहीं है लेकिन यह एक अच्छा समाधान की तरह लगता है! कृपया वापस आएं और अगर आपको एक बेहतर तरीका मिल जाए तो हमें बताएं ... –

+0

हम एक ही समस्या में भाग गए हैं और बेहतर समाधान ढूंढना पसंद करेंगे। फ़िर भी सहायता के लिए धन्यवाद। कम से कम हम अभी भी अनब्लॉक कर रहे हैं! – jasonkarns

+0

इस समस्या में खुद को चलाएं (activerecord 3.1.3) और सुझाए गए समस्या का समाधान किया है। मैं सहमत हूं कि एक बेहतर समाधान अधिक आदर्श होगा। –

3

मैं इस समाधान का उपयोग कर रहा है - भूमि के ऊपर पुन: लोड तालिका परिभाषा के बहुत लग रहा था और मैं बेतरतीब ढंग से मुद्दों हर बार वर्ग डीईएफ़ पुनः लोड किया गया था देखना होगा - मैं क्या देख रहा था कि जब establish_connection OtherDb वर्गों में से प्रत्येक में बुलाया गया था था ।

# The idea here is to specify that a given model should use another 
# database without having to change the entire inheritance hierarchy 

# declare model for table in primary connection 
class Bar < ActiveRecord::Base 
    # assume we have logic here that we don't want to refactor into a module 
    # but we do want to inherit in OtherDb::Bar 
end 

module Foo 

    # base model in Foo namespace - uses another db 
    class BaseConnection < ActiveRecord::Base 
    # OtherDb::Title.database contains a db config hash 
    # This would probably go in the initializers 
    establish_connection OtherDb::Title.database 
    end 

    # module used to override db connection 
    module OtherDb::Base 
    def retrieve_connection 
     # connection_handler.retrieve_connection(self) # normal behavior 
     connection_handler.retrieve_connection(Foo::BaseConnection) # use db from Foo::BaseConnection 
    end 
    end 

    # Foo::Bar is identical to ::Bar but is in another db 
    class Bar < ::Bar 
    extend OtherDb::Base 
    end 
end 
संबंधित मुद्दे