2016-06-01 5 views
3

Ich habe eine Webanwendung in Rails 4.2.6, die ursprünglich MongoDB (über Mongoid 5) als Hauptdatenbank verwendet. Jetzt muss ich jedoch eine Verbindung zu einer MySQL-Datenbank herstellen, um nur einige zusätzliche Daten für meine App zu lesen.Meine Rails 4.2.6 App verwendet zwei Datenbanken. Kann ich nur einen für Testzwecke verwenden?

Bis jetzt habe ich ActiveRecord in meinem Projekt benötigt und konnte die Verbindung mit der oben genannten Datenbank in der Entwicklungsumgebung herstellen. Meine Konfigurationsdateien für diese Angelegenheit sind:

mongoid.yml

development: 
    clients: 
    default: 
     database: mongo_development 
     hosts: 
     - localhost:27017 
     options: 
test: 
    clients: 
    default: 
     database: mongo_test 
     hosts: 
     - localhost:27017 
     options: 
     read: 
      mode: :primary 
     max_pool_size: 1 
    options: 
    raise_not_found_error: false 

database.yml

development: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: mysql_development 
    pool: 5 
    username: user 
    password: pass 
    socket: /var/run/mysqld/mysqld.sock 

Das Problem kommt, wenn ich meine Test-Suite laufen. Ich verwende RSpec und bundle exec rspec spec Ausführung ergibt die folgende Fehlermeldung:

/home/user/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'test' database is not configured. Available: ["development"] (ActiveRecord::AdapterNotSpecified) 

Active beschwert sich für eine Testdatenbank mit zu verbinden, aber das Problem ist, dass ich nicht über eine MySQL-Datenbank zu Testzwecken haben: die Spezifikationen Ich schrieb nur mit Mongoid-Modellen interagieren.

Ich überlegte, eine leere MySQL-Datenbank als Hack zu erstellen, aber ich möchte zuerst wissen, wenn ich ActiveRecord konfigurieren konnte, keine Verbindung zu einer Testdatenbank herzustellen und nur mongo_test zu verwenden.

Ist es möglich zu tun, was ich will? Weiß jemand, wie man das macht?

Antwort

1

Ich beschloss, meine eigene Frage zu beantworten, da die bereitgestellten Antworten nicht meinen Bedürfnissen entsprachen.

Nach vielen Versuchen und Fehlern konnte ich vermeiden, eine Verbindung zu einer MySQL-Datenbank in Test Umgebung Anpassung der Informationen in dieser question post.

Das einzige, was ich tun musste, war die folgende Juwel meiner Gemfile hinzuzufügen:

group :test do 
    gem 'activerecord-nulldb-adapter' 
end 

Dieses Juwel installiert den Adapter in das Projekt, das Active NullDB Datenbank ermöglicht eine Verbindung ohne die zu etablieren müssen eine echte Datenbank definieren.

Last but not least, ich aktualisiert meine config/database.yml die Parameter einer Datenbankverbindung in Test Umgebung hinzufügen, die den neuen Adapter verwendet:

test: 
    adapter: nulldb 
    encoding: utf8 
    reconnect: false 
    database: mysql_test 
    pool: 5 
    username: user 
    password: pass 
    socket: /var/run/mysqld/mysqld.sock 
1

Hier sind zwei Abhilfen

Entweder: eine SQLite-Datenbank für Ihren Test env hinzufügen.

test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
    pool: 5 
    timeout: 5000 

Oder: Ihr automatisches Laden von application.rb zu umgebungsspezifischen Konfigurationen bewegen und das activerecord Juwel zu einem development env auf Gemfile bewegen.

Gemfile

group :development do 
    gem 'activerecord' 
end 

config/application.rb:

  • Erstens: bewegen, dies zu config/environments/test.rb und config/environments/development.rb (bedenken Sie, welche Modelle Sie aus dem ausschließen möchten test env, dh die activerecord mo

entfernen require 'rails/all' Linie und erfordern Frameworks Sie speziell in jeder Umgebung Datei verwenden möchten.

+0

Vielen Dank für Ihren Vorschlag. Ich versuche, die zweite beschriebene Problemumgehung anzuwenden, aber ich habe einige Probleme mit dem automatischen Laden von 'activerecord' Modellen. Es scheint, als ob die 'config.autoload_paths' -Variable nicht in den umgebungsspezifischen Dateien geändert werden kann, wie in http://guides.rubyonrails.org/autoloading_and_loading_constants.html#autoload-paths erwähnt. –

+0

Überprüfen Sie diese Antwort zu' config.ager_load_paths' und wie es sich zwischen Entwicklung und Produktion unterscheidet http://stackoverflow.com/questions/19773266/confusing-about-autoload-paths-vs-eager-load-paths-in-rails-4, ich denke, es wird nützlich sein. –

+0

Nochmals vielen Dank für Ihre Hilfe, Mohamed! Ich war in der Lage, das Laden meiner 'activerecord' Modelle und das Erfordernis von 'activerecord's Railtie in _config/application.rb_ unter Bedingungen wie' require 'active_record/railtie' zu isolieren, außer Rails.env.test?' Und 'config .autoload_paths + = Verzeichnis [Rails.root.join ('lib', 'antifraud', '** /')] außer Rails.env.test? '. Derzeit, wenn ich meine Spezifikationen ausführen, schlagen sie alle den gleichen Fehler zurück: 'ActiveRecord :: ConnectionNotEstablished: Kein Verbindungspool für ActiveRecord :: Base' Ist dieser Fehler für Sie sinnvoll? Würdest du wissen, wie man es löst? –

Verwandte Themen