MM はこれをネイティブにサポートしていませんが、プラグインを介してモデルごとに行うのはそれほど難しくありません。
module MongoMapper
module Plugins
module ReadPreference
extend ActiveSupport::Concern
included do
class << self
attr_accessor :read_preference
end
end
module ClassMethods
def query(options={})
options.merge!(:read => read_preference) if read_preference
super options
end
def with_read_preference(preference)
self.read_preference = preference
begin
yield
ensure
self.read_preference = nil
end
end
end
end
end
end
MongoMapper::Document.plugin(MongoMapper::Plugins::ReadPreference)
そして、マスターのみのクラスターでテストします。
2.0.0p0 :002 > User.first
=> <User:0x30a1948 _id: 4cddf1ff98db746691000002, display_name: (Deleted account)>
2.0.0p0 :003 > User.with_read_preference(:secondary) { User.first }
Mongo::ConnectionFailure: No replica set member available for query with read preference matching mode secondary and tags matching [].
できます!
接続に対してグローバルな設定が必要な場合は、モジュール属性を使用して MongoMapper モジュールを拡張し、プラグインを変更して最初にそれを探すこともできます。