セッション
Mongoid では、ActiveRecord でトランザクションを実行するのと同様の方法でセッションを使用できます。 つまり、モデル クラスまたはモデルのインスタンスでメソッド #with_session
を呼び出し、ブロック内でいくつかの操作を実行できます。 ブロック内のすべての操作は単一のセッションのコンテキストで実行されます。 どのようなセッション オプションが利用できるかについては、MongoDB Ruby ドライバーのドキュメントを参照してください。
セッションの次の制限に注意してください。
セッションはスレッド間で共有できません。セッションはスレッドセーフではありません。 これは Ruby ドライバーの セッションに対するサポートと整合性があります。
セッションはネストできません。 モデルクラスまたはモデルインスタンスの
#with_session
メソッドに渡されるブロック内のモデルインスタンスでは、#with_session
を呼び出すことはできません。セッション ブロック内で使用されるすべてのモデル クラスと インスタンスは、同じドライバー クライアントを使用する必要があります。 たとえば、ブロックで使用される別のモデルに対して、
#with_session
が呼び出されるモデル クラスまたはインスタンスとは異なるstorage_options
を指定した場合、エラーが発生します。
Model#with_session 経由でのセッションの使用
モデル クラスで#with_session
を呼び出し、セッション オプションを渡して、セッションのコンテキストでブロックを実行します。
Person.with_session(causal_consistency: true) do Person.create! person = Person.first person.name = "Emily" person.save end
model#with_session 経由でのセッションの使用
モデル インスタンスで#with_session
を呼び出し、セッション オプションを渡して、セッションのコンテキストでブロックを実行します。
person.with_session(causal_consistency: true) do person.username = 'Emily' person.save person.posts << Post.create! end