0

私が構築しているRails 3.2アプリケーションとは完全に別のサードパーティデータベースにクエリを実行する必要があります(私の会社が内部で使用している別のアプリケーションに属しています)。

最終的には、Rails アプリケーションが処理する「他の」データベースから新しい行をロードするように cron をセットアップします。

設定するためのアクセス権がありますがotherdb、ここからどこへ行くべきか迷っています。新しいエントリを で作成しconfig/database.ymlますか? otherdbもしそうなら、デフォルトの Railsdevelopmentproductiondbではなく、いつクエリを に送信するかを指定するにはどうすればよいですか?

4

2 に答える 2

1

この要件を実装する方法はいくつかありますが、最も簡単な方法はconfig/database.yml、カスタムの名前空間モデルを使用することです。

以下のようなものを設定しRails.env、命名規則に従うために接尾辞を使用すると、概説した機能が提供されます。

まず、既存の各環境の外部データベースに新しいエントリを作成します。機能をテストできるようになります。

# database.yml
development:
  # add configuration as required

otherdb_development:
  # add configuration as required

次に、データベースでアクセスする必要のある特定のテーブルごとにモデルを追加しotherdbます。otherdb混乱や潜在的な混乱を避けるために、これらのモデルの名前空間ディレクトリを追加することをお勧めします(以下の例)。

# /app/models/otherdb
class Otherdb::Foo < ActiveRecord::Base
  establish_connection "otherdb_#{Rails.env}"
  set_table_name "foo" # customize this if the table name will be different from the classname and is required
end

次に、(例として)メソッドOtherdb::Fooを使用して、必要に応じて結果のデータを使用できます。

于 2012-09-12T05:56:37.293 に答える
1

私は昨日同じ問題を抱えていました。Rails 3.2 を使用しているため、外部データベースに接続するすべてのモデルは、接続を確立する単一の抽象クラスのサブクラスである必要があります。Railsの以前のバージョンでは、@Sashaの回答が機能していました。しかし 3.2 では、その答えによって、さまざまな紛らわしいデータベース エラーが発生します。(どのようなエラーが発生するかは、使用する DB によって異なります。)

Rails 3.2 では、これが機能することがわかった唯一の方法です。

  1. デフォルト以外のデータベースと通信する必要があるすべてのモデルに共通の基本クラスを作成します。
  2. を呼び出して、この基底クラスが抽象クラスであることを ActiveRecord に伝えself.abstract_class = trueます。
  3. establish_connection基本クラスを呼び出します。

外部テーブルからの学生とコースの例を次に示します。

# database.yml:
development:
  # default configuration goes here

other_development:
  # external db configuration goes here

class OtherTable < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "other_#{Rails.env}"
end

class Student < OtherTable
end

class Course < OtherTable
end

詳細については、私が書いた「Establishing a Connection to a Non-Default Database in Rails 3.2 」というタイトルのブログ記事を参照してください。

于 2012-09-22T04:20:22.807 に答える