1

私の要件は、在庫管理のようなものです。すべての開発環境 (現在は 5 つ) で同じテーブルと対話する Web アプリを作成し、更新、削除などを行う必要があります。

を使用して複数のDBに接続することについて読みました:

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

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

今、私は単一のテーブルを持っています

class Table1Qa1 < Qa1
end

class Table1Qa2 < Qa2
end

class Table1Qa3 < Qa3
end

これは機能しますが、同じテーブルに対して非常に多くのモデルオブジェクトを作成する代わりに、接続するためのより良い方法があると考えていますか?

Rails 3.2 と Ruby 1.9.3 を使用しています

ありがとう

4

3 に答える 3

2

理解しておくべき重要なことの1つは、本当にこのようにする必要があるかということです。異なるデータベース間で 1 つまたは複数のテーブルの内容を同期することだけが必要な場合、マスター テーブルから他のテーブルにレコードを定期的にコピーする cron ジョブを作成するのは、おそらく次のように簡単です。

connection_params.each do |params|
  ActiveRecord::Base.establish_connection(params)

  sql = "INSERT INTO #{params[:table_name]} (Foo, Bar, Fizz, Buzz)
        SELECT Foo, Bar, Fizz, Buzz
        FROM master_qa"
        #optionally WHERE ...

  ActiveRecord::Base.connection.execute(sql)
end

あるいは、異なる環境に異なるロジックを適用する必要がある場合、テーブルごとに 1 つの ActiveRecord モデルを実装することはそれほど悪い考えではないかもしれません。結局のところ、共通のロジックを Ruby モジュールに保持し、そのモジュールをすべてのモデルに混在させることができます。

module QA
  def self.order_by_foo
    order("foo DESC")
  end

  def self.included(model_class)
    # This hooks gets fired whenever the QA gets included by a class.
    # You can use it to call class methods on your models. Eg:
    model_class.validates :foo, :presence => true
  end
end

class Qa1 < ActiveRecord::Base
  include QA
  establish_connection(:qa1)
end

class Qa2 < ActiveRecord::Base
  include QA
  establish_connection(:qa2)
end

class Qa3 < ActiveRecord::Base
  include QA
  establish_connection(:qa3)
end
于 2013-03-11T22:54:55.340 に答える
1

ar-octopusあなたは宝石を試すことができます - https://github.com/tchandy/octopus

あなたはこれを行うことができるように見えます、

Octopus.using(:db1) do
  User.create(:name => "Mike")
end

Octopus.using(:db2) do
  User.create(:name => "Mike")
end

@user_db1 = User.using(:db1).find_by_name("Sam")
@user_db2 = User.using(:db2).find_by_name("Sam")
于 2013-03-11T22:15:23.900 に答える