質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3555閲覧

外部DBに接続し、受け取ったデータをもとにモデルオブジェクトを作成したい

HirooTakizawa

総合スコア12

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2016/06/22 07:41

###前提・実現したいこと
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

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「別データベースにあるモデル用の基底クラスを用意して、そこから継承させる」というのが適当な手段のようです(Qiita)。

投稿2016/06/22 08:02

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問