2011-11-01 18 views
13

मेरे पर्यावरण मिलती है: रूबी 1.9.2p290, 3.0.9 रेल और RubyGem 1.8.8रेल 3 के साथ एकाधिक डेटाबेस हालत

दुर्भाग्य से मैं एक मुद्दा जब एकाधिक डेटाबेस आ जाती है,।

स्थिति यह है: मेरे पास दो अलग-अलग डेटाबेस के साथ दो मॉडल कनेक्ट हैं और एक-दूसरे के बीच संबंध स्थापित करना भी है। डेटाबेस प्रत्येक मॉडल में निर्दिष्ट कनेक्शन, देखो पसंद करती है

class Visit < ActiveRecord::Base 
    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    self.establish_connection "main" 
    has_many :visits 
end 

मैं एक त्रुटि हो गया, जब मिलते हैं इस परिदृश्य पर

@visits = Visit.joins(:patient) 

त्रुटियाँ: Mysql2 :: त्रुटि: टेबल 'lab.patients' मौजूद नहीं है: visits चुनें। * visits INNER JOIN patients पर patients पर जाएं। id शून्य

यहाँ 'मरीजों के टेबल' मुख्य 'डेटाबेस में है और' प्रयोगशाला 'डेटाबेस में' विज़िट 'तालिका मुझे शक है जब कोड को क्रियान्वित करने, कि रेल' मरीजों के तालिका विचार कर रहा है 'प्रयोगशाला' का हिस्सा है डेटाबेस [जो 'विज़िट' टेबल रखता है]।

+0

अतिरिक्त जानकारी के लिए [अंक # 539] (https://github.com/rails/rails/issues/539) देखें – cweston

उत्तर

9

ठीक है, मैं अगर यह सबसे सुरुचिपूर्ण समाधान है पता नहीं है, लेकिन मैं इस self.table_name_prefix को परिभाषित स्पष्ट रूप से डेटाबेस वापस जाने के लिए द्वारा काम करने के लिए मिला नाम।

class Visit < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "lab." : "lab_#{renv}.") 
    end 

    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "main." : "main_#{renv}.") 
    end 

    self.establish_connection "main" 
    has_many :visits 
end 

मैं अभी भी शामिल होने की स्थिति निर्दिष्ट करने के लिए सभी विवरणों के माध्यम से काम कर रहा हूं, लेकिन मुझे उम्मीद है कि इससे मदद मिलती है।

def self.table_name_prefix 
    "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 
    end 

कि आपके database.yml फ़ाइल से उपयुक्त डेटाबेस नाम खींच लेंगे

+0

यह तरीका है कि दो डेटाबेस एक ही मशीन पर हैं या नहीं। बहुत बढ़िया। –

+0

कामकाजी समाधान प्रदान करने के लिए धन्यवाद।- srosenhamer –

+0

http://apidock.com/rails/ActiveRecord/Base/table_name_prefix/class – s2t2

2

क्या आपका दूसरा डेटाबेस दूसरी मशीन पर है? तुम हमेशा के रूप में इस दूसरे प्रश्न में सुझाव कर सकते हैं:

MySQL -- Joins Between Databases On Different Servers Using Python?

+0

नहीं दोनों डेटाबेस एक ही मशीन में हैं। दौरे और रोगी को अलग से कॉल करते समय रेल उपयुक्त डेटाबेस दिखते हैं। 'विज़िट = विज़िट.फर्स्ट.patient' और vise versa ठीक काम करता है। केवल मॉडल दोनों में शामिल होने पर समस्या। –

7

इस तरह कुछ करने के लिए क्लीनर हो सकता है self.table_name_prefix दूसरों द्वारा प्रस्तावित के रूप में, लेकिन आप इसे थोड़ा और अधिक साफ तरीके से परिभाषित कर सकते हैं:

self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 

वैकल्पिक रूप से आप भी इस इस्तेमाल कर सकते हैं:

self.table_name_prefix "#{connection.current_database}." 

आप को ध्यान में रखना है कि बाद के एक प्रश्न SELECT DATABASE() as db पहली बार है कि वर्ग भरी हुई है पर अमल होगा।

1

या यहां तक ​​कि

def self.table_name_prefix 
    self.connection.current_database+'.' 
end 
संबंधित मुद्दे