2012-05-18 2 views
2

Я пытаюсь настроить Rails (v3.2.2) для использования нескольких баз данных. Я делаю это на основе этого Connecting Rails 3.1 with Multiple Databases.Rails: указание другой базы данных в модели

Моя модель:

class Category < ActiveRecord::Base                                                                         
    establish_connection :category_database                                                                              
    self.primary_key = "cat_id"                                     

    validates_presence_of :name, :display_name, :description, :icon, :image, :parent_category_id, :create_time                                                                                                                                                     
end 

database.yml:

category_database:                                        
    adapter: mysql2                                        
    encoding: utf8                                         
    reconnect: false                                        
    database: main_cat                                       
    pool: 5                                          
    username: root                                         
    password: blah                                          
    socket: /var/run/mysqld/mysqld.sock 

Когда я запускаю этот файл спецификации:

require 'spec_helper'                                       

describe Category do                                        
    puts "ENV: #{Rails.env}"                                      
    it { should validate_presence_of :name }                                  
    it { should validate_presence_of :display_name }                                
    it { should validate_presence_of :description }                                
    it { should validate_presence_of :icon }                                  
    it { should validate_presence_of :image }                                  
    it { should validate_presence_of :parent_category_id }                               
    it { should validate_presence_of :create_time }                                

end    

так:

>rspec /path/to/category_spec.rb 

я получаю:

/home/user/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:45:in `resolve_hash_connection': database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified) 

Я также попытался установить establish_connection так:

establish_connection(                                       
    :adapter => "mysql2",                                      
    :encoding => "utf8",                                       
    :reconnect => false,                                      
    :database => "main_cat",                                     
    :pool => 5,                                         
    :username => "root",                                       
    :password => "blah",                                        
    :socket => "/var/run/mysqld/mysqld.sock") 

, что приводит к тем же исключением. (AdapterNotSpecified)

Что странно, что если я вообще отказаться от establish_connection и применить ту же самую конфигурацию соединения через database.yml файл, как это:

test:                                           
    adapter: mysql2                                        
    encoding: utf8                                         
    reconnect: false                                        
    database: main_cat                                       
    pool: 5                                          
    username: root                                         
    password: blah                                          
    socket: /var/run/mysqld/mysqld.sock 

это работает.

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

Большое спасибо!

ответ

6

Получается, что Rails требует наличия конфигурации по умолчанию. В этом случае для файла database.yml по-прежнему требуется тестовая база данных. В противном случае Rails будет генерировать исключение, поскольку оно ожидает установить некоторое соединение до того, как модели будут инициализированы. После загрузки конфигурации по умолчанию Rails переходит позже, чтобы инициализировать модели, а затем конфигурация базы данных на уровне модели может быть выполнена через connection_connection.

Я надеюсь, что это поможет кому-то еще. Это заняло у меня значительное количество времени работает отладчик через

ActiveRecord-3.2.2/Библиотека/active_record/connection_adapters/аннотация/connection_specification.rb

, чтобы понять это.

0

У меня была та же ошибка по той же причине, однако у меня была проверка: конфигурация в моей базе данных.yml; но проблема была в моем предоставлении методы «установить соединение» в рамках определения модели:

establish_connection 'cm_inv_mgmt_' + Rails.env.downcase 

хотя я предоставил разделы database.yml для производства/постановочной и развитие окружающей среды, я пропускал cm_inv_mgmt_test!

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