###前提・実現したいこと
railsで、外部のDBに接続し、データを受け取った上で、
そのデータをもとにインスタンスを作成したいと思っています。
外部DBにestaplish_connection
で接続し、データを受け取った後に、モデルオブジェクトを作成するようにしたところ、下記のエラーが発生しました。
したの「試したこと」にも記載いたしましたが、エラーが発生しなくなる方法を見つけることはできました。
ただ、そのやり方が本質的な解決方法になっているのか、他の問題を発生させないかがわからず、ご質問させていただきました。
宜しくお願いします。
###発生している問題・エラーメッセージ
下記のエラーメッセージが発生しました。
Users/hoge/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec': PG::UndefinedTable: ERROR: relation "events" does not exist (ActiveRecord::StatementInvalid) LINE 5: WHERE a.attrelid = '"events"'::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"events"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum from /Users/hoge/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `block in exec_no_cache'
###該当のソースコード
下記をrails runner Tasks::CreateHogeEvents.execute
で実行したところ上記のエラーが発生しました。
ruby
1require "#{Rails.root}/app/models/event" 2 3class Tasks::CreateHogeEvents 4 def self.execute 5 require 'active_record' 6 7 config = { 8 adapter: 'postgresql', 9 host: 'hoge', 10 database: 'hoge', 11 port: 5432, 12 username: 'hoge', 13 password: 'hoge', 14 encoding: 'utf8', 15 timeout: 5000, 16 } 17 18 ActiveRecord::Base.establish_connection(config) 19 20 Rails.logger.info("CreateHogeEvents") 21 puts "CreateHogeEvents start" 22 23 con = ActiveRecord::Base.connection 24 25 #外部DBより必要なデータを持ってくる。 26 result = con.select_all('SELECT name,event_id,event_time,place,description,created_at FROM hogehoge') 27 result.to_hash 28 puts result.to_hash 29 30 # この1行を追加するとエラーは発生しなくなる。 31 # ActiveRecord::Base.establish_connection(:development) 32 33 #上記のエラーが発生する。 34 event = Event.new 35 event = Event.new( 36 name: result.to_hash[0]['name'] 37 ) 38 end 39end
###試したこと
上記のコード内にも記載させていただきましたが、ActiveRecord::Base.establish_connection(:development)
を追記すると、エラーは発生しなくなりました。
おそらく、外部DBとのコネクションを作るとEvent.new
が外部DB内のテーブルを読みに行ってしまうのかと思っています。
そのため改めてdevelopment
のDBと接続するとEvent.new
が正しいDBを読みに行き、エラーが発生しなくなるのかと思いました。
この解決方法でよろしいでしょうか。何か問題点・懸念点等ございましたら、ご教授頂けますと幸いです。
(頻繁なestablish_connection
は良くない、など)
###補足情報(言語/FW/ツール等のバージョンなど)
Rails 4.2.5
postgresql
宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。