2012-04-28 7 views
5

Przeczytałem w dokumentacji, jak to zrobić, ale w praktyce mam problemy. W mojej aplikacji mam 2 różne bazy danych, jak opisano poniżej w pliku database.yml.Jak korzystać z wielu baz danych w aplikacji Railsowej Używając database.yml

sqlite_test: 
    adapter: sqlite3 
    database: db/sqlite_test.sqlite3 
    table: plots 
    pool: 5 
    timeout: 5000 

development: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: test 
    pool: 5 
    username: myname 
    password: mypassword 
    host: localhost 

Moja aplikacja jest dynamicznym ploter, który będzie wykreślić dane w bazie danych (podstawowego) bez wiedzy whats w bazie danych, czy jak jej struktury. Obie te bazy danych zawierają różne dane. Baza danych SQLite, którą utworzyłem w oddzielnej aplikacji Rails.

Obecna aplikacja, której używam, zbudowana jest wokół bazy danych MYSQL, którą buduję zewnętrznie. Skopiowałem bazę danych SQLite do katalogu/db. Tak więc w moim głównym modelu, kiedy mówię:

class Plot < ActiveRecord::Base 

    establish_connection :development 
    set_table_name "stock_test" 
    set_primary_key :id 

Wszystko działa dobrze i elegancko. Jednak, kiedy go zmienić na:

establish_connection :sqlite_test 
set_table_name "plots" 

i próbują uzyskać dostęp do bazy danych za pośrednictwem konsoli Rails, otrzymuję błąd mówiąc:

>>ActiveRecord::AdapterNotSpecified: database configuration does not specify adapter 

Nie wiem, dlaczego tak jest, skoro plik database.yml wyraźnie nie określa adapter? Kiedy jednak robię to ręcznie w moim modelu, wszystko działa dokładnie tak, jak powinno.

class Plot < ActiveRecord::Base 
establish_connection(:adapter => "sqlite3", :database => "db/sqlite_test.sqlite3", :pool => 5) 

Dlaczego to wszystko działa, kiedy ręcznie określić co jest w database.yml, ale nie wtedy, gdy po prostu użyć odniesienie database.yml?

Dzięki!

Odpowiedz

4

Próbowałem wykonać replikę i uruchomiłem. Ma to związek z konwencjami nazewnictwa: Jesteś w trybie programowania, a AR będzie szukał tagu rozwoju, który w twoim przypadku nie istnieje dla sqlite.

Oto moja database.yml:

development: 
    adapter: mysql2 
    database: se_development 
    username: root 
    pool: 5 
    timeout: 5000 

sqlite_development: 
    adapter: sqlite3 
    database: db/development.sqlite3 
    pool: 5 
    timeout: 5000 

Oto model:

class Plot < ActiveRecord::Base 
    establish_connection 'sqlite_' + Rails.env 
end 

pracował dla mnie. Mam nadzieję że to pomoże.

+0

czy to nie działa, jeśli masz dwa 'development:' z różnymi kluczami/wartościami? – vol7ron

Powiązane problemy