2011-01-20 28 views
6

Tôi đang sử dụng đường ray 2.3.5 và mysql.Chuyển đổi kết nối trên ActiveRecord :: Lược đồ

Tôi có một mô hình TableA và một mô hình TableB khác. TableA là hoàn toàn tốt .. nhưng tôi cần phải trao đổi các kết nối cho TableB. Tôi đang kết nối với một máy chủ khác ở nơi khác vì vậy tôi phải kiểm tra xem bảng đó có tồn tại hay không. Nếu không, tôi sẽ tạo một bảng mới.

TableB.establish_connection(new_database_params) 
unless TableB.table_exists? 
    ActiveRecord::Base.establish_connection(new_database_params) 
    ActiveRecord::Schema.define do 
    create_table :table_bs do |t| 
     t.column :text, :string 
    end 
    end 
    ActiveRecord::Base.establish_connection("#{RAILS_ENV}")  
end 

Tôi nhận thấy rằng TableB.establish_connection (new_database_params) kết nối tôi với máy chủ mới. Điều đó hoàn toàn ổn.

Khi cố gắng tạo một bảng mới, tôi vẫn phải gọi cho ActiveRecord :: Base để hoán đổi kết nối. Có cách nào để trao đổi kết nối trên ActiveRecord :: Schema? (tương tự như Model.establish_connection?)

+0

Bạn có tìm thấy câu trả lời cho câu trả lời này không? Tôi đang cố gắng để đạt được chính xác điều tương tự. –

Trả lời

8

Về mặt khái niệm, tôi có cùng một vấn đề. Tôi muốn phân lớp ActiveRecord :: Base và xây dựng một lược đồ cho kết nối đó. Nó đã cho tôi một thời gian dài để tìm ra, và rất nhiều lặn vào ActiveRecord :: Base, Schema và Migration, nhưng tôi tìm thấy một giải pháp hoạt động, và nó thực sự rất đơn giản.

Dưới mui xe, Giản đồ là một phân lớp của Di chuyển và nó gọi instance_eval trên khối bạn cung cấp. Do đó, chúng tôi đang trong phạm vi của lớp Migration và có thể thay đổi nó @connection biến ví dụ để kết nối của các phân lớp ActiveRecord :: Base, ví dụ:

ActiveRecord::Schema.define do 
    @connection = TableB.connection 
    create_table :table_bs do |t| 
    t.column :text, :string 
    end 
end 

Tôi nhận ra câu trả lời này có lẽ là một năm quá muộn! Nhưng nó vẫn có thể được sử dụng cho ai đó.

+1

Điều này rất hữu ích, cảm ơn! – netmute

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