Различные соединения с базой данных в рельсах на основе пользовательских параметров - PullRequest
4 голосов
/ 07 апреля 2011

Я занимаюсь рефакторингом некоторых функций устаревшего php-приложения, которое использует несколько баз данных с одинаковой структурой, по одной на каждый язык. Когда пользователь входит в систему, выбирает его язык, и затем все последующие соединения устанавливаются с базой данных для этого приложения с некоторым кодом, подобным этому:

$db_name = 'db_appname_' . $_SESSION['language'];
mysql_connect(...);
mysql_select_db($db_name);

Я бы хотел провести рефакторинг и базы данных, но в настоящее время это не вариант, потому что другие части программного обеспечения должны оставаться в рабочем состоянии со старой структурой, пока разрабатывается новое приложение и какое-то время после его разработки.

Я видел этот вопрос , но и вопрос, и предлагаемые гемы довольно старые, и кажется, что они не работают с Rails 3.

Какой лучший способ добиться такого поведения в моем новом приложении rails 3? Есть ли другой выбор, который позволит мне изменить структуру БД и удовлетворить мои потребности?

Последняя деталь: в приложении php даже данные для входа хранятся в отдельных таблицах, т. Е. Каждый БД имеет свою собственную таблицу пользователей, и когда пользователь входит в систему, он также передает языковой параметр в форме входа в систему. Я хотел бы использовать devis для аутентификации в новом приложении, которое, вероятно, не будет работать с этим подходом, поэтому я думаю продублировать (я знаю, это не СУХОЙ) информацию для входа в отдельную модель пользователя с атрибутом языка и отдельную базу данных, совместно используемую языками, для использования функций устройства в моем приложении. Это вызовет какие-либо проблемы?

EDIT:

Для полноты я закончил с этим конфигурационным файлом yml

production: &production
  adapter: mysql
  host: localhost
  username: user
  password: secret
  timeout: 5000

production_italian:
  <<: *production
  database: db_app_ita

production_english:
  <<: *production
  database: db_app_eng

и с этим конфигом в базовой модели (на самом деле не совсем так, но для ясности)

MyModel < AR::Base
  establish_connection "production_#{session[:language]}"
  ...
end

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

используйте establish_connection в ваших моделях:

MyModel < AR::Base
  establish_connection "db_appname_#{session[:language]}"
  ...
end
0 голосов
/ 19 сентября 2012

Используйте MultiConfig gem, который я создал, чтобы упростить это.

Вы можете указать конфиги в отдельном файле, например database_italian.yml и т. Д., А затем вызвать:

ActiveRecord::Base.config_file = 'database_italian'

Таким образом, будет намного проще в обслуживании и чистоте.Просто добавьте больше языковых файлов конфигурации базы данных по вашему желанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...