2

複数のデータベースを使用するようにRails(v3.2.2)を設定しようとしています。これは、複数のデータベースを使用したこのConnectingRails3.1に基づいて行っています。

私のモデル:

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はestablish_connectionを完全に無視しているようです...アプリケーションレベルの構成設定などがありませんか?Railsにestablish_connectionを認識させて、さまざまなモデルをさまざまなデータベースに配置できるようにするにはどうすればよいですか?

とても有難い!

4

2 に答える 2

6

したがって、Railsにはデフォルト構成の存在が必要であることがわかります。この場合でも、database.ymlファイルにはテストデータベースが必要です。それ以外の場合、Railsは、モデルが初期化される前に何らかの接続を確立することを期待しているため、例外をスローします。デフォルト構成がロードされると、Railsは後でモデルを初期化し、次にモデルレベルのデータベース構成をestablish_connectionを介して実行できます。

これが他の誰かに役立つことを願っています。デバッガーを実行するのにかなりの時間がかかりました

activerecord-3.2.2 / lib / active_record / connection_adapters / abstract / connection_specification.rb

これを理解するために。

于 2012-05-21T22:13:36.927 に答える
0

ほぼ同じ理由で同じエラーが発生しましたが、テストを行いました。database.ymlの構成。しかし、問題は、モデル定義内の「接続の確立」メソッドのプロビジョニングにありました。

  establish_connection 'cm_inv_mgmt_' + Rails.env.downcase

実稼働/ステージングおよび開発環境用にdatabase.ymlのセクションを提供しましたが、cm_inv_mgmt_testがありませんでした。

于 2013-07-11T04:49:41.270 に答える