実際には、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
私はこれをテストしていません。
出典
2017-09-10 21:34:49
max
これはプログラミング関連ではありませんが、ミラーデータベースを設計するのは簡単ではないので、アプリケーション内で別のクエリを実行しなくても同じデータを持つことができますか? – CatBrownie