3

作成中のアプリで Rails 4.0 の複数のデータベースを試しています。これに基づいて:複数のデータベースと Rails 3.1 を接続し、 http://api.rubyonrails.org/classes/ActiveRecord/Base.html

異なる接続を使用するいくつかのモデルを作成できましたが、コードを DRY に保つために抽象クラスから接続を継承しようとすると、Rails 4.0 は自動的に単一テーブル継承を実行しようとしていると見なします。情報を照会し、テーブルが存在しないという Mysql::Error をスローします。

以下は、現在のベース クラスの状態を明らかにするためのコード スニペットです。

Class Mps < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "mps"
end

子クラス:

Class TblAdmVsl < Mps
  self.table_name = "tbladmvsl"
end

コードをできるだけDRYに保ちたいので、これを回避する方法はありますか。以下は、レールコンソールでこれを試したときに受け取ったエラーです

2.0.0-p247 :005 > TblAdmVsl.first
  TblAdmVsl Load (4.5ms)  SELECT `tbladmvsl`.* FROM `tbladmvsl` ORDER BY `tbladmvsl`.`id` ASC LIMIT 1
  Mysql::Error: Table 'mps2_tbl.mps' doesn't exist: SHOW FULL FIELDS FROM `mps`
  ActiveRecord::StatementInvalid: Mysql::Error: Table 'mps2_tbl.mps' doesn't exist: SHOW     FULL FIELDS FROM `mps`
        from /home/maru/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `query'
        from /home/maru/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `block in execute'
4

1 に答える 1

1

これを試して:

Class Mps < ActiveRecord::Base
  self.abstract_class = true
  self.table_name = "mps"
  establish_connection self.table_name
end

class TblAdmVsl < Mps
  self.table_name = "tbladmvsl"
end

データベース名のみで接続を確立する機能があるかどうかはわかりません。この関数をどこかでオーバーライドする可能性がありますが、これに対する標準的な解決策は、config(database.yml のコピー) ファイルを渡して接続することです。

new_config = ActiveRecord::Base.configurations[Rails.env].clone
new_config['database'] = "another_database_name"
ActiveRecord::Base.remove_connection #optional if you need to remove current connection
ActiveRecord::Base.establish_connection new_config
于 2013-09-18T08:41:47.347 に答える