0

私たちのアプリは、さまざまなフィードからデータを受け取ります。

1つのフィードがデータベースの形式で提供されます。したがって、このデータベースは、アプリデータベースと同じMySQLサーバーインスタンスに存在します。このフィードデータベースへのさらなる更新はデルタとして提供され、完全なフィードデータベースに処理する必要があります。

ので、私は持っています:

  • app_db
  • feed_db
  • feed_delta_db

feed_db同じ構造(テーブル、feed_delta_db列など)です。

アクセスする必要がfeed_dbある場合と、にアクセスする必要がある場合がありますfeed_delta_db

feed_dbデルタの受信を開始する前に、次のようにアクセスしました。

module Feed
  module Db
    module InstanceMethods
      def something
        puts 'pffffft'
      end
    end

    def self.included(receiver)
      receiver.send :include, InstanceMethods
      receiver.instance_eval {
        establish_connection(
          {
            :adapter => "mysql2",
            :database => "feed_db",
            :username => "mysql_user",
            :password => nil,
            :host => "localhost"
          }
        )
      }
    end
  end

  class FeedModel < ActiveRecord::Base
    include Db
    self.abstract_class = true
  end

  class Sometable < FeedModel
    set_table_name "sometable"
    belongs_to :someothertable, :foreign_key => "SomeothertableID", :primary_key => "id"

    def name
      "#{field1} #{field2}"
    end
  end
end

これで、このすべてのコードをに複製できますfeed_delta_db。変更する必要があるのは、接続の詳細で指定されたデータベースだけです。

でもそれはDRYじゃないですよね?

結果は私が望むものになるでしょう。Feed::Sometable次のように、別々のデータベースのテーブルにアクセスできます。 FeedDelta::Sometable

クラス定義を独自のファイルに分離し、それらを個別のモジュール(またはクラス)に含める/要求する/何でもして、どちらのデータベースにも自由にアクセスできるようにするにはどうすればよいですか?

不明な点がありましたらお知らせください。

ありがとう。

4

1 に答える 1

1

一般的な親クラスを定義してから、子クラスでデータベースを切り替えます

class GenericParent < ActiveRecord::Base
  self.abstract_class = true
end

class Feed < GenericParent
  establish_connection :feed_db
end

class FeedDelta < GenericParent
  establish_connection :feed_delta_db
end

# config/database.yml
development:
  ...

feed_db:
  ...

feed_delta_db:
  ...

さまざまな環境を尊重するのが賢明でしょう。したがって、次のestablish_connectionようになります。

class Feed < GenericParent
  establish_connection :"feed_#{Rails.env}"
end

これにより、database.yml に feed_development、feed_staging、feed_production などのセクションを含めることができます。

于 2012-12-17T22:27:40.733 に答える