rails matchers cleaner bot ruby-on-rails activerecord rspec database-connection

ruby-on-rails - matchers - rspec ruby



Rieles RSpec con mĂșltiples bases de datos (4)

Ejecuto una aplicación de Rails, y estamos en el proceso de dividir nuestro proceso de registro en una aplicación separada. La aplicación de registro tiene su propia base de datos separada (para CMS y prospectos de recopilación), pero también necesita tener acceso a la base de datos principal. Esto funciona muy bien usando ActiveRecord::Base.establish_connection .

Sin embargo, me gustaría poder escribir algunas especificaciones. El problema es cómo puedo escribir especificaciones / pruebas sin borrar mi base de datos de desarrollo cada vez que se ejecutan mis pruebas. Si entro en la consola en modo de prueba, es obvio que el modo de prueba está enganchado en la base de datos de desarrollo desde mi aplicación principal.

Así es como se ve mi archivo database.yml:

development: database: signup_dev test: database: signup_test main_app_dev: database: main_app_dev main_app_test: database: main_app_test

Basado en este archivo, me gustaría establish_connection my_app_dev para conectarme a la base de datos my_app_dev en modo de desarrollo y my_app_test en modo de prueba. ¿Algunas ideas?


Acabamos de usar la interpolación para esto:

class ServiceModel < ActiveRecord::Base establish_connection :"main_app_#{Rails.env}" end

Lo divertido :"main_app_" sintaxis :"main_app_" hace un símbolo de una cadena. Esto también podría escribirse "main_app_#{Rails.env}".to_sym . En cualquier caso con Rails 4.1 esto debe ser un símbolo (en 3.2 habíamos usado una cadena).


Esto es lo que se me ocurrió como mixin:

# lib/establish_connection_to_master_database.rb module EstablishConnectionToMasterDatabase def establish_connection_to_master_database case RAILS_ENV when "development" establish_connection :master_dev when "test" establish_connection :master_test when "production" establish_connection :master end end end ActiveRecord::Base.send(:extend, EstablishConnectionToMasterDatabase) # models/subscription.rb class Subscription < ActiveRecord::Base establish_connection_to_master_database end # config/initializers/config.rb require ''establish_connection_to_master_database''

Para que esto funcione con RSpec, esto debe cargarse en un inicializador; al parecer, cargarlo en el archivo de entorno hace que se cargue demasiado tarde y no funcionará.


Ryan, también estábamos en el proceso de migrar de un almacén de datos a otro. Necesitábamos desarrollarnos en dos bases de datos y mantener migraciones y accesorios independientes para cada una.

Creé una gema llamada Secondbase para ayudar con esto. Esencialmente, le permite administrar dos bases de datos sin problemas en una sola aplicación de Rails. Quizás también solucione tu problema: https://github.com/karledurante/secondbase


Tenemos una joya que es básicamente una colección de modelos ActiveRecord que se conectan a nuestro sistema heredado. En nuestro caso, tenemos todos esos modelos contenidos en un módulo desde el cual se conectan todos los modelos relacionados con la base de datos heredada.

module Legacy class Base < ActiveRecord::Base establish_connection :legacy end class User < Base end end

Con esta configuración, hace que sea muy fácil cambiar la conexión de la base de datos. Si realmente busca esa detección automática, puede poner lógica en su clase base para determinar qué base de datos usar:

module Legacy class Base < ActiveRecord::Base if Rails.env == ''test'' establish_connection :legacy_test else establish_connection :legacy end end

O simplemente dile a tu módulo qué conexión usar en tu ayudante de especificaciones:

# spec/spec_helper.rb Legacy::Base.establish_connection(ActiveRecord::Base.configurations[''legacy_test''])

Personalmente, recomendaría la segunda opción. Por supuesto, ambas soluciones dependen de modelos de espacio de nombres.

Mirar