2011-11-01 33 views
13

môi trường của tôi: của Ruby 1.9.2p290, Rails 3.0.9 và 1.8.8 RubyGemRails 3 - Nhiều cơ sở dữ liệu với điều kiện gia nhập

tiếc là tôi có một vấn đề khi đi qua nhiều cơ sở dữ liệu.

Tình huống này là: Tôi có hai mô hình kết nối với hai cơ sở dữ liệu khác nhau và cũng thiết lập mối liên hệ giữa nhau. kết nối cơ sở dữ liệu quy định cụ thể trong từng mô hình, nhìn thích

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

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

tôi nhận được một thông báo lỗi khi gặp nhau sau kịch bản

@visits = Visit.joins(:patient) 

Lỗi: Mysql2 :: Lỗi: Bảng 'lab.patients' không tồn tại: CHỌN visits. * TỪ visits INNER JOIN patients TRÊN patients. id IS NULL

Bảng 'bệnh nhân' nằm trong cơ sở dữ liệu 'chính' và 'lượt truy cập' trong cơ sở dữ liệu 'lab' Tôi nghi ngờ khi thực thi mã, Rails đang xem xét bảng 'bệnh nhân' là một phần của 'lab' cơ sở dữ liệu [giữ bảng 'lượt truy cập'].

+0

Xem [Vấn đề # 539] (https://github.com/rails/rails/issues/539) để biết thêm thông tin – cweston

Trả lời

9

Vâng, tôi không biết nếu điều này là giải pháp thanh lịch nhất, nhưng tôi đã có được điều này để làm việc bằng cách định nghĩa self.table_name_prefix trở lại một cách rõ ràng cơ sở dữ liệu Tên.

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 

Tôi vẫn đang làm việc qua tất cả các chi tiết khi nói đến việc xác định điều kiện tham gia, nhưng tôi hy vọng điều này sẽ hữu ích.

+0

Đây là cách để đi nếu hai cơ sở dữ liệu trên cùng một máy. Làm tốt. –

+0

cảm ơn vì đã cung cấp giải pháp làm việc.- srosenhamer –

+0

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

2

Cơ sở dữ liệu thứ 2 của bạn trên máy khác? Bạn luôn có thể làm như đề xuất trong câu hỏi khác này:

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

+0

Không. Cả hai cơ sở dữ liệu đều nằm trong cùng một máy. Rails trông có cơ sở dữ liệu thích hợp khi gọi điện đến lượt truy cập và Bệnh nhân một cách riêng biệt. 'visits = Visit.first.patient' và ngược lại hoạt động tốt. Vấn đề chỉ khi tham gia cả hai mô hình. –

7

Có thể sạch hơn để làm một cái gì đó như thế này:

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

Điều đó sẽ kéo tên cơ sở dữ liệu thích hợp từ tập tin database.yml của bạn

1

Hoặc thậm chí

def self.table_name_prefix 
    self.connection.current_database+'.' 
end 
0

Tôi muốn sử dụng các self.table_name_prefix như được đề xuất bởi những người khác, nhưng bạn có thể xác định nó một cách rõ ràng hơn một chút như thế này:

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

cách khác bạn cũng có thể sử dụng này:

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

Bạn cần phải ghi nhớ rằng sau này sẽ thực hiện một truy vấn SELECT DATABASE() as db lần đầu tiên lớp đó được tải.

Các vấn đề liên quan