2013-07-14 3 views
0

Я создаю приложение rails для хранения множества различных подключаемых к базе данных подключений к базе данных и выполнения произвольного sql для каждого из них. Я представляю каждую строку подключения к базе данных как экземпляр модели «connection» и хочу иметь возможность написать метод для запроса базы данных, представленной каждым соединением, в идеале с помощью ORM activerecord. Однако мой код, записанный, перезаписывает соединение с базой данных для всей таблицы соединений, когда я использую метод connection_connection в следующем коде. Как бы вы посоветовали мне изменить код для запроса произвольной базы данных, не перезаписывая соединение для всей таблицы Connections?с помощью activerecord с вложенными базами данных

class Connection < ActiveRecord::Base 
    validates_presence_of :host, :port, :db_name, :db_user, :db_password, :db_type 

    def connect 
    self.connection = ActiveRecord::Base.establish_connection(
     adapter: self.db_type, 
     host: self.host, 
     database: self.db_name, 
     username: self.db_user, 
     password: self.db_password 
    ) 
    end 

end 

ответ

1

Хороший способ сделать это делает модель для каждого соединения с базой данных вам нужно, а затем сделать другие модели как подклассы них. Так, например:

  1. Определить все необходимые соединения в database.yml (на-среде)
# DB 1 
    development: 
     adapter: mysql2 
     encoding: utf8 
     database: db_1 
     username: **** 
     password: **** 
     host: ******** 
     pool: 5 
     ... 

    # DB 2 
    db2_development: 
     adapter: mysql2 
     encoding: utf8 
     database: db_2 
     username: **** 
     password: **** 
     host: ******** 
     pool: 5 
     ... 

    # Same for production (and/or other environments) 
    production: 
     ... 
    db2_production: 
     ... 
  1. определить модель "мастер" для каждой базы данных, который наследует от ActiveRecord::Base
# DB1 
    class DB1 < ActiveRecord::Base 
     self.abstract_class = true 
    end 

    # DB2 
    class DB2 < ActiveRecord::Base 
     self.abstract_class = true 
     establish_connection "db2_#{Rails.env}" 
    end 

    ... 
  1. Теперь определим все модели специфичные для базы данных в качестве подклассов моделей, определенных выше, таким образом:
# DB1 specific model 
    class DB1_model < DB1 
     # model logic here 
    end 

    # DB2 specific model 
    class DB2_model < DB2 
     # model logic here 
    end 

    ... 

И вы хорошо идти.

Таким образом, вы можете подключиться к N баз данных в различных средах (обычно development, staging, preprod и production, но они могут отличаться в вашем случае).

Кроме того, помните, что Rails будет управлять пулом соединений SQL для каждой базы данных.

В приведенном выше примере, Rails будет открыть максимум 5 соединений для каждой базы данных, так что общие будут (для одного экземпляра приложения). Если вы используете Phusion Passenger или Unicorn и создаете 8 экземпляров приложения, то общее количество SQL-соединений будет (максимально) 10 * 8 = 80.

+0

Спасибо за идею ... Я только что создал метод экземпляра для каждого которая возвращает соединение, используя камень Sequel. Таким образом, базы данных не обязательно должны быть предварительно определены в database.yml. Но я приму свой ответ! – user1609682

+0

@ user1609682 Спасибо, если вы согласитесь (я надеюсь, это помогло вам найти свое решение)! – xmikex83

Смежные вопросы