2017-09-10 16 views
1

私は、PostgreSQLとMemSQL(MySQLと互換性のある分析データベース)の2つのデータベースバックエンドを持つRuby on Railsアプリケーションを持っています。2つのデータベースを同時に持つActiveRecordモデル

どのように私はそれは同時に両方のデータベース、作成、更新およびステートメントの両方で実行されているDELETE、およびSELECTクエリは唯一のPostgreSQL上で実行されるように永続化され、その結果Modelを設定することができますか?

つまり、同じActiveRecordモデルを使用して2つのデータベースバックエンドを常に同一に維持するにはどうすればよいですか?

+0

これはプログラミング関連ではありませんが、ミラーデータベースを設計するのは簡単ではないので、アプリケーション内で別のクエリを実行しなくても同じデータを持つことができますか? – CatBrownie

答えて

1

実際には、2つのモデルクラスを使用してこれを行うことができます。しかし、コンポジションと複雑さに関しては、コンプは多くあります。基底クラスでそれらを保存することにより、ActiveRecordの共有接続:

class MemSQLBase < ActiveRecord::Base 
    establish_connection configurations['memsql'][Rails.env] 
    self.abstract_class = true 
end 

class Post < ApplicationRecord 
    after_save :push_to_memsql! 
    def push_to_memsql! 
    MemSQLPost.save_or_update!(self.attributes) 
    end 
end 

class MemSQLPost < MemSQLBase 
    self.table_name = :posts 
    def self.model_name 
    ActiveModel::Name.new("Post") 
    end 
end 

厄介な部分は、あなたが、彼らは基本クラスを共有していないとして、モジュールを使用しなければならないことは、ポストとMemSQLPost間でコードを共有することです。

クラスの接続方法をmonkeypatchingことによって、これを回避することが可能である:あなたがあなた自身であるけれども

# this class does nothing except holding the connection pool 
class MemSQLBase < ActiveRecord::Base 
    establish_connection configurations['memsql'][Rails.env] 
    self.abstract_class = true 
end 

module MemSQLMonkeyPatch 
    extend ActiveSupport::Concern 

    class_methods do 
    def connection_pool 
     MemSQLBase.connection_pool 
    end 

    def retrieve_connection 
     MemSQLBase.retrieve_connection 
    end 

    def connected? 
     MemSQLBase.connected? 
    end 

    def remove_connection(klass = self) 
     MemSQLBase.remove_connection 
    end 
    end 
end 

class Post < ApplicationRecord 
    after_save :push_to_memsql! 
    def push_to_memsql! 
    MemSQLPost.save_or_update!(self.attributes) 
    end 
end 

class Post < MemSQLBase 
    include MemSQLMonkeyPatch 
    self.table_name = :posts 
end 

私はこれをテストしていません。

+0

これにはもう少し多くのことがあります。どちらのデータベースにも移行を適用する(または複製する)必要があります。適切な出発点を提供する必要があるマルチDBレールアプリについてのブログ記事はたくさんあります。 – max

関連する問題