データ操作の実行
項目一覧
- Overview
- 作成操作
- 作成します。
- create
- save!
- 保存
- 読み取り操作
- 属性
- 再読み込み
- アップデート操作
- update_attributes!
- update_attributes
- update_attribute
- upsert
- access
- 削除操作
- 削除
- 破棄する
- delete_all
- delete_all
- 永続性属性
- new_record?
- 永続化された場合
- フィールド値にアクセス
- フィールド値の取得と設定
- read_attribute と write_attribute
- 一括書込み (write) 属性
- アトミックな更新演算子
- グループ アトミック操作
- ダーティ トラッキング
- 変更を表示
- 変更をリセット
- 永続性
- 以前の変更を表示
- コンテナ フィールドの更新
- 読み取り専用ドキュメント
- 詳細情報
Overview
このガイドでは、Mongoid を使用してCRUD (作成、読み取り、アップデート、削除)操作を実行し、 MongoDBコレクション内のデータを変更する方法を学習できます。
Mongoid は、 アクティブ レコード や データマッパー などの他のRubyマッパーを使用して実行できるCRUD操作をサポートしています。 Mongoid を使用する場合、一般的な永続化操作では、他の ODM のようにドキュメント全体がデータベースに書き込まれるのではなく、変更されたフィールドのみがアトミックにアップデートされます。
作成操作
作成操作を実行して、コレクションに新しいドキュメントを追加 できます。コレクションが存在しない場合、操作暗黙的にコレクションが作成されます。次のセクションでは、新しいドキュメントを作成する際に使用できる方法について説明します。
作成します。
モデルクラスの create!
メソッドを使用して、1 つ以上のドキュメントをコレクションに挿入します。サーバーまたは検証エラーが発生した場合、create!
は例外を発生させます。
create!
を呼び出すには、挿入するドキュメントを定義する属性のハッシュを渡します。複数のドキュメントを作成して挿入する場合は、ハッシュの配列を渡します。
この例では、 create!
を呼び出す複数の方法を示しています。最初の例では1 つの Person
ドキュメントを作成し、2 番目の例では2 つの Person
ドキュメントを作成します。 3 つ目の例ではdo..end
ブロックを create!
に渡します。 Mongoid は、create!
に渡されたドキュメントを引数としてこのブロックを呼び出します。 create!
メソッドは、ブロックの最後にドキュメントを保存しようとします。
Person.create!( first_name: "Heinrich", last_name: "Heine" ) Person.create!([ { first_name: "Heinrich", last_name: "Heine" }, { first_name: "Willy", last_name: "Brandt" } ]) Person.create!(first_name: "Heinrich") do |doc| doc.last_name = "Heine" end
create
新しいドキュメントまたは複数の新しいドキュメントをデータベースに挿入するには、 create
メソッドを使用します。 create
は、!
サフィックスが付いたバージョンとは異なり、検証エラーの例外を発生させません。 create
は、重複する _id
フィールドを持つドキュメントを挿入した場合など、サーバーエラーに対して例外を発生させます。
create
で検証エラーが発生した場合、ドキュメントは挿入されず、挿入された他のドキュメントとともに返されます。 persisted?
、new_record?
、または errors
メソッドを使用して、データベースに挿入されたドキュメントを検証できます。
この例では、 create
を使用して新しいドキュメントをMongoDBに挿入する方法を示します。最初の例は、 Person
ドキュメントを挿入する方法を示しています。 2 番目の例では2 つの Post
ドキュメントを挿入しようとしていますが、2 番目のドキュメントには重複するタイトルが含まれているため、検証に失敗します。次に、この例では persisted?
メソッドを使用して、どのドキュメントがコレクションに正常に挿入されたかを確認します。
Person.create( first_name: "Heinrich", last_name: "Heine" ) class Post include Mongoid::Document validates_uniqueness_of :title end posts = Post.create([{title: "test"}, {title: "test"}]) posts.map { |post| post.persisted? } # => [true, false]
persisted?
new_record?
メソッドと メソッドの詳細については、このガイドの 永続性属性のセクション を参照してください。
save!
変更された属性をコレクションにアトミックに保存したり、新しいドキュメントを挿入したりするには、save!
メソッドを使用します。サーバーまたは検証エラーが発生した場合、save!
は例外を発生させます。 new
メソッドを使用して新しいドキュメントインスタンスを作成できます。次に、save!
を使用してドキュメントをデータベースに挿入します。
次の例では、 save!
を使用して新しい Person
ドキュメントを挿入し、既存のドキュメントの first_name
フィールドを更新する方法を示します。
person = Person.new( first_name: "Esmeralda", last_name: "Qemal" ) person.save! person.first_name = "Malik" person.save!
保存
save
メソッドは、検証エラーが発生した場合に例外を発生させません。サーバーエラーが発生した場合、save
は引き続き例外を発生させます。このメソッドは、変更された属性がすべて保存されている場合は true
を返し、検証エラーが発生した場合は false
を返します。
次のオプションを save
に渡すことができます。
validate: false
: 新しいドキュメントまたは更新された属性を保存するときに検証をバイパスします。touch: false
: 指定された属性を更新するときにupdated_at
フィールドを更新しないようにします。このオプションは、新しいドキュメントを挿入する場合には効果がありません。
次のコードでは、save
を使用して新しいドキュメントを挿入します。次に、そのドキュメントを更新し、validate: false
オプションを適用します。
person = Person.new( first_name: "Tamara", last_name: "Graham" ) person.save person.first_name = "Aubrey" person.save(validate: false)
読み取り操作
読み取り操作を実行して、コレクションからドキュメントを取得できます。ドキュメントのサブセットを検索するためのクエリフィルターの作成の詳細については、 クエリの指定ガイドをご覧ください。
属性
attributes
メソッドを使用して、モデルインスタンスの属性をハッシュとして検索できます。このハッシュには、すべての埋め込みドキュメントの属性も含まれます。
次の例は、 attributes
の使用方法を示しています。
person = Person.new(first_name: "James", last_name: "Nan") person.save puts person.attributes
{ "_id" => BSON::ObjectId('...'), "first_name" => "James", "last_name" => "Nan" }
再読み込み
MongoDBからドキュメントの最新バージョンにアクセスするには、reload
メソッドを使用します。ドキュメント を再読み込みすると、Mongoid は同じクエリにあるすべての埋め込み関連付けも再読み込みします。ただし、Mongoid は参照された関連付けを再読み込みしません。代わりに、次回のアクセス時にデータベースからロードされるように、これらの値をクリアします。
ドキュメントで reload
を呼び出すと、ドキュメントに対する保存されていない変更はすべて失られます。次のコードは、ドキュメントで reload
を呼び出す方法を示しています。
band = Band.create!(name: 'Sun 1') # => #<Band _id: ..., name: "Sun 1"> band.name = 'Moon 2' # => #<Band _id: ..., name: "Moon 2"> band.reload # => #<Band _id: ..., name: "Sun 1">
上記の例では、 band
ドキュメントの name
フィールドを更新しますが、新しい値は保存しません。 Mongoid は name
値への変更を永続化しなかったため、name
にはデータベースに保存された元の 値が含まれます。
注意
ドキュメントが見つかりませんエラー
Mongoid がデータベース内のドキュメントを見つけられない場合、デフォルトでは Mongoid::Errors::DocumentNotFound
エラーが発生します。 mongoid.yml
ファイルで raise_not_found_error
構成オプションを false
に設定すると、Mongoid は新しいドキュメントを保存し、その属性をデフォルト値に設定します。通常、_id
フィールドの値も変更されます。このため、raise_not_found_error
が false
に設定されている場合に reload
を使用することは推奨されません。
保存されていないドキュメントを再読み込みする
永続化されていないドキュメントに対して reload
を呼び出すと、メソッドはドキュメントの _id
値に対して find
クエリを実行します。
次の例では、保存されていないドキュメントで reload
を呼び出し、name
フィールド値を出力します。 reload
はドキュメントの _id
値を使用して find
操作を実行し、これにより Mongoid はコレクション内の既存のドキュメントを取得します。
existing = Band.create!(name: 'Photek') band = Band.new(id: existing.id) band.reload puts band.name
Photek
アップデート操作
アップデート操作を実行して、コレクション内の既存のドキュメントを変更できます。削除されたドキュメント を更新しようとすると、Mongoid は FrozenError
例外を発生させます。
update_attributes!
既存の モデルインスタンスの属性を更新するには、update_attributes!
メソッドを使用します。このメソッドは、検証またはサーバーエラーが発生した場合に例外を発生させます。
次の例では、 update_attributes!
を使用して既存のドキュメントの first_name
属性と last_name
属性を更新する方法を示します。
person.update_attributes!( first_name: "Maximilian", last_name: "Hjalmar" )
Tip
Mongoid は、1 回の呼び出しでドキュメントとそのネストされた関連付けを更新できるネストされた属性機能を提供します。詳細については、「 ネストされた属性のガイド 」を参照してください。
update_attributes
update_attributes
メソッドは検証エラーの例外を発生させません。このメソッドは、検証に合格し、ドキュメントが更新された場合は true
を返し、そうでない場合は false
を返します。
次の例は、 update_attributes
の使用方法を示しています。
person.update_attributes( first_name: "Hasan", last_name: "Emine" )
update_attribute
update_attribute
メソッドを使用して検証をバイパスし、 モデルインスタンスの単一の属性を更新できます。
次の例では、 update_attribute
を使用してドキュメントの first_name
属性の値を更新する方法を示しています。
person.update_attribute(:first_name, "Jean")
upsert
upsert
メソッドを使用して、ドキュメント を更新、挿入、または置換できます。
upsert
は replace
オプションを受け入れます。このオプションを true
に設定しており、upsert
を呼び出すドキュメントがデータベースにすでに存在する場合、新しいドキュメントがデータベース内のドキュメントに置き換えられます。新しいドキュメントに置き換えられないデータベース内のフィールドは削除されます。
replace
オプションを false
に設定しており、ドキュメントがデータベースに存在する場合は更新されます。 Mongoid は、 更新ドキュメントで指定されたフィールド以外のフィールドを変更しません。ドキュメントがデータベースに存在しない 場合は、 アップデートドキュメントで指定されたフィールドと値が挿入されます。 replace
オプションはデフォルトで false
に設定されています。
次の例では、 upsert
を使用してまず新しいドキュメントを挿入し、次に replace: true
を設定して置き換える方法を示します。
person = Person.new( first_name: "Balu", last_name: "Rama" ) person.upsert person.first_name = "Ananda" person.upsert(replace: true)
access
touch
メソッドを使用して、ドキュメントの updated_at
タイムスタンプを現在の時刻に更新できます。 touch
は、ドキュメントの belongs_to
関連付けのいずれかへの更新をカスケードします。オプションとして別の時間値フィールドを渡して、そのフィールドを更新することもできます。
次の例では、 touch
を使用して updated_at
と audited_at
のタイムスタンプを更新します。
person.touch(:audited_at)
削除操作
削除操作を実行して、コレクションからドキュメントを削除できます。
削除
データベースからドキュメントを削除するには、delete
メソッドを使用します。 delete
を使用すると、Mongoid はコールバックを実行しません。ドキュメントがデータベースに保存されていない場合、delete
は同じ _id
値を持つドキュメントを削除しようとします。
次の例では、 delete
メソッドの使用方法を示し、データベースに保存されていないドキュメントを削除した場合に何が起こるかを示します。
person = Person.create!(name: 'Edna Park') unsaved_person = Person.new(id: person.id) unsaved_person.delete person.reload
前述の例では、 を呼び出すと MongoidMongoid::Errors::DocumentNotFound
reload
unsaved_person.delete
person
は_id
エラーを発生させます。これは、2 つのドキュメントで の値が同じであるためです。
破棄する
destroy
メソッドは delete
と同様に動作しますが、destroy
を呼び出すと Mongoid がコールバックを実行します。ドキュメントがデータベースで見つからない場合、destroy
は同じ _id
を持つドキュメントを削除しようとします。
次の例は、 destroy
の使用方法を示しています。
person.destroy
delete_all
delete_all
メソッドは、 Mongoid モデルクラスによってモデル化されているすべてのドキュメントをコレクションから削除します。 delete_all
はコールバックを実行しません。
次の例は、 delete_all
を使用してすべての Person
ドキュメントを削除する方法を示しています。
Person.delete_all
delete_all
destroy_all
メソッドは、 Mongoid モデルクラスによってモデル化されているすべてのドキュメントをコレクションから削除します。 Mongoid はすべてのドキュメントをメモリにロードするため、これはコストのかかる操作になる可能性があります。
次の例は、 destroy_all
を使用してすべての Person
ドキュメントを削除する方法を示しています。
Person.destroy_all
永続性属性
次のセクションでは、ドキュメントがデータベースに保存されているかどうかを確認するために使用できる Mongoid が提供する属性について説明します。
new_record?
new_record?
true
属性は、モデルインスタンスがまだデータベースに保存されていない場合は を返し、それ以外の場合はfalse
を返します。逆の条件としてpersisted?
属性がチェックされます。
次の例は、 new_record?
の使用方法を示しています。
person = Person.new( first_name: "Tunde", last_name: "Adebayo" ) puts person.new_record? person.save! puts person.new_record?
true false
永続化された場合
persisted?
属性は、Mongoid が モデルインスタンスを保持する場合は true
を返し、それ以外の場合は false
を返します。逆の条件として new_record?
属性がチェックされます。
次の例は、 persisted?
の使用方法を示しています。
person = Person.new( first_name: "Kiana", last_name: "Kahananui" ) puts person.persisted? person.save! puts person.persisted?
false true
フィールド値にアクセス
Mongoid は、 ドキュメントのフィールド値にアクセスするいくつかの方法を提供します。次のセクションでは、フィールド値にアクセスする方法について説明します。
フィールド値の取得と設定
ドキュメントのフィールド値を取得して設定するには、複数の方法があります。フィールドを明示的に 宣言すると、ドキュメントでこのフィールド値を直接取得して設定できます。次の例は、Person
インスタンスの first_name
フィールドを設定して取得する方法を示しています。
class Person include Mongoid::Document field :first_name end person = Person.new person.first_name = "Artem" person.first_name # => "Artem"
上記の例では、まず first_name
属性を使用して値を設定し、次にその属性を再度呼び出して値を取得します。
また、Mongoid モデルインスタンスで []
メソッドと [] =
メソッドを使用して、 ハッシュ構文 を使用して属性にアクセスすることもできます。 []
メソッドは read_attribute
メソッドのエイリアスであり、[] =
メソッドは write_attribute
メソッドのエイリアスです。次の例は、 []
メソッドと []=
メソッドを使用してエイリアス first_name
フィールドを取得して設定する方法を示しています。
class Person include Mongoid::Document field :first_name, as: :fn end person = Person.new(first_name: "Artem") person["fn"] # => "Artem" person[:first_name] = "Vanya" # => "Artem" person # => #<Person _id: ..., first_name(fn): "Vanya">
これらのメソッドの詳細については、このガイドの次の read_attribute および write_attribute セクションを参照してください。
read_attribute と write_attribute
read_attribute
メソッドと write_attribute
メソッドを使用して、フィールドの読み取りまたは書き込み時にカスタム動作を指定できます。これらのメソッドは、モデルを定義するとき、またはモデル インスタンスで呼び出して使用できます。
read_attribute
を使用してフィールド を取得するには、フィールドの名前を メソッドに渡します。 write_attribute
を使用してフィールド を設定するには、フィールドの名前と割り当てる値を渡します。
次の例では、モデル定義で read_attribute
と write_attribute
を使用して、fn
属性の読み取りと書込みに使用されるメソッドとして first_name
と first_name=
を定義します。
class Person include Mongoid::Document def first_name read_attribute(:fn) end def first_name=(value) write_attribute(:fn, value) end end person = Person.new person.first_name = "Artem" person.first_name # => "Artem"
また、モデルインスタンスで read_attribute
と write_attribute
を直接呼び出して、属性を取得して設定することもできます。次の例では、モデルインスタンスでこれらのメソッドを使用して first_name
属性を取得し、それを値 "Pushkin"
に設定します。
class Person include Mongoid::Document field :first_name, as: :fn end person = Person.new(first_name: "Artem") # => #<Person _id: ..., first_name(fn): "Artem"> person.read_attribute(:first_name) # => "Artem" person.read_attribute(:fn) # => "Artem" person.write_attribute(:first_name, "Pushkin") person # => #<Person _id: ..., first_name(fn): "Pushkin">
一括書込み (write) 属性
モデルインスタンスで attributes=
メソッドまたは write_attributes
メソッドを使用して、同時に複数のフィールドに書き込むことができます。
attributes=
メソッドを使用するには、モデルインスタンスで メソッドを呼び出し、設定するフィールドと値を含むハッシュオブジェクトを渡します。次の例は、 attributes=
メソッドを使用して person
ドキュメントの first_name
フィールドと middle_name
フィールドを設定する方法を示しています。
person.attributes = { first_name: "Jean-Baptiste", middle_name: "Emmanuel" }
write_attributes
メソッドを使用するには、モデルインスタンスで メソッドを呼び出し、設定するフィールドと値を渡します。次の例は、 write_attributes
メソッドを使用して person
ドキュメントの first_name
フィールドと middle_name
フィールドを設定する方法を示しています。
person.write_attributes( first_name: "Jean-Baptiste", middle_name: "Emmanuel", )
アトミックな更新演算子
Mongoid は、モデル インスタンスでメソッドとして呼び出すことができる次の更新演算子のサポートを提供します。これらのメソッドは操作をアトミックに実行し、検証とコールバックをスキップします。
次の表は、Mongoid でサポートされている演算子を説明したものです。
演算子 | 説明 | 例 | |||
---|---|---|---|---|---|
| 指定された値を配列値フィールドに追加します。 |
| |||
| フィールドのビット単位の更新を実行します。 |
| |||
| フィールドの値を増加させます。 |
| |||
| 配列フィールドの最初または最後の要素を削除します。 |
| |||
| 指定された条件に一致する値のすべてのインスタンスを、配列フィールドから削除します。 |
| |||
| 配列フィールドから指定された値のすべてのインスタンスを削除します。 |
| |||
| 指定された値を配列フィールドに追加します。 |
| |||
| 一致するすべてのドキュメント内のフィールドの名前を変更します。 |
| |||
| Updates an attribute on the model instance and, if the instance
is already persisted, performs an atomic $set on the field, bypassing
validations.set can also deeply set values on Hash fields.set can also deeply set values on embeds_one associations.
If a model instance's embeds_one association document is nil , one
is created before the update.set cannot be used with has_one associations. |
| |||
| 一致するすべてのドキュメント内の特定のフィールドを削除します。 |
|
更新演算子の詳細については、 MongoDB Serverマニュアルの「 更新演算子 」を参照してください。
グループ アトミック操作
アトミック操作をグループ化するには、 モデルインスタンスで atomically
メソッドを使用できます。 Mongoid は、単一のアトミック コマンドで atomically
ブロックに渡すすべての操作を送信します。
注意
トランザクションを使用して複数のドキュメントを不可分的に変更する
アトミック操作は一度に 1 つのドキュメントに適用されます。したがって、ネストされた ブロックは 1atomically
つのアトミック操作で複数のドキュメントを変更することはできません。 1 回のアトミック操作で複数のドキュメントに変更を加えるには、マルチドキュメントトランザクションを使用します。トランザクションの詳細については、「 トランザクションとセッション のガイド 」を参照してください。
次の例は、 atomically
を使用してドキュメント内の複数のフィールドを不可分的に更新する方法を示しています。
person.atomically do person.inc(age: 1) person.set(name: 'Jake') end
単一のドキュメントを更新するときに #atomically
ブロックをネストできます。デフォルトでは 、Mongoid はブロックが終了するときに、各ブロックに定義されたアトミック書込みを実行します。次の例は、 atomically
ブロックをネストする方法を示しています。
person.atomically do person.atomically do person.inc(age: 1) person.set(name: 'Jake') end raise 'An exception' # Name and age changes are persisted end
前の例では、$inc
操作と $set
操作は内部 atomically
ブロックの最後に実行されています。
結合コンテキスト
atomically
メソッドは join_context: true
オプションを受け入れて、最も外側の atomically
ブロックの末尾で操作を実行するように指定します。このオプションを有効にすると、最も外側のブロックのみ、または join_context
が false
である最初のブロックのみがデータベースに変更を書き込みます。次の例ではjoin_context
オプションを true
に設定します。
person.atomically do person.atomically(join_context: true) do person.inc(age: 1) person.set(name: 'Jake') end raise 'An exception' # Name and age changes are not persisted end
前の例では、Mongoid は最も外側の atomically
ブロックの末尾で $inc
操作と $set
操作を実行しています。ただし、ブロックが終了し、これらの操作が実行される前に例外が発生し、変更は保持されません。
atomically
また、コンテキストのグローバル結合を有効にして、操作がデフォルトで最も外側の ブロックで実行されるようにすることもできます。このオプションをグローバルに有効にするには、join_contexts
true
mongoid.yml
ファイルで 構成オプションを に設定します。 Mongoid 構成オプションの詳細については、「 自己管理型構成ファイル オプション 」を参照してください。
join_contexts
を true
にグローバルに設定すると、atomically
ブロックで join_context: false
オプションを使用して、そのブロックのブロックの末尾でのみ操作を実行できます。
ダーティ トラッキング
アクティブ モデルで使用可能な Mongoid APIと同様の Mongoid API を使用して、変更された(「ダーティ」)フィールドを追跡できます。モデル内の定義済みのフィールドを変更すると、Mongoid はモデルをダーティとしてマークし、特別なアクションを実行できるようにします。次のセクションでは、ダーティ モデルの操作方法について説明します。
変更を表示
Mongoid は、モデルがインスタンス化された時点から保存されるまで、新しいドキュメントとして、またはデータベースから取得したユーザーの変更を記録します。永続化操作により、変更がクリアされます。
Mongoid は、 モデルインスタンスへの変更を調査できるモデル固有のメソッドを作成します。次のコードは、 モデルインスタンスの変更を表示する方法を示しています。
# Retrieves a person instance person = Person.first # Sets a new `name` value person.name = "Sarah Frank" # Checks to see if the document is changed person.changed? # true # Gets an array of changed fields. person.changed # [ :name ] # Gets a hash of the old and changed values for each field person.changes # { "name" => [ "Sarah Frink", "Sarah Frank" ] } # Checks if a specific field is changed person.name_changed? # true # Gets the changes for a specific field person.name_change # [ "Sarah Frink", "Sarah Frank" ] # Gets the previous value for a field person.name_was # "Sarah Frink"
注意
関連付けの変更の追跡
ドキュメントに関連付けを設定しても、changes
ハッシュまたは changed_attributes
ハッシュは変更されません。これは、すべてのタイプの関連付けに当てはまります。ただし、参照された関連付けの _id
フィールドを変更すると、変更が changes
と changed_attributes
ハッシュに表示されます。
変更をリセット
次のコードに示すように、reset
メソッドを呼び出すことで、変更されたフィールドを以前の値にリセットできます。
person = Person.first person.name = "Sarah Frank" # Reset the changed `name` field person.reset_name! person.name # "Sarah Frink"
永続性
Mongoid は、すべての永続化操作の基盤として ダーティ 追跡 を使用します。保存のたびにドキュメント全体を書込む他のフレームワークと比較して、ドキュメントの変更を評価し、変更された内容のみをアトミックにアップデートします。変更を加えない場合、Model#save
を呼び出すと、Mongoid はデータベースにアクセスしません。
以前の変更を表示
モデルをMongoDBに永続化すると、Mongoid は現在の変更をクリアします。ただし、次のコードに示すように、previous_changes
メソッドを呼び出すことで、過去に行われた変更を確認できます。
person = Person.first person.name = "Sarah Frank" person.save # Clears out current changes # Lists the previous changes person.previous_changes # { "name" => [ "Sarah Frink", "Sarah Frank" ] }
コンテナ フィールドの更新
Mongoid には現在、Set
や Array
などのコンテナタイプの属性への変更をMongoDBに保存できない問題があります。 MongoDBに保存するには、コンテナ型を含むすべてのフィールドの値を割り当てる必要があります。
例、次のコードに示すように インスタンスにアイテムを追加しても、Set
MongoDBへの変更は保持されません。
person = Person.new person.interests # => #<Set: {}> person.interests << 'Hiking' # => #<Set: {"Hiking"}> person.interests # => #<Set: {}> # Change does not take effect
この変更を永続化するには、次のコードに示すように、モデル外でフィールド値を変更し、そのフィールド値をモデルに戻す必要があります。
person = Person.new interests = person.interests # => #<Set: {}> interests << 'Hiking' # => #<Set: {"Hiking"}> # Assigns the Set to the field person.interests = interests # => #<Set: {"Hiking"}> person.interests # => #<Set: {"Hiking"}>
読み取り専用ドキュメント
Mongoid.legacy_readonly
機能フラグの値に応じて、次の方法でドキュメントを読み取り専用としてマークできます。
このフラグが オフ になっている場合は、そのドキュメントで
readonly!
メソッドを呼び出すことで、そのドキュメントを読み取り専用としてマークできます。結果の読み取り専用ドキュメントでは、保存、更新、削除、破棄など、任意のReadonlyDocument
永続化操作を実行しようとすると エラーが発生します。再読み込みしても読み取り専用状態はリセットされないことに注意してください。person = Person.first person.readonly? # => false person.readonly! # Sets the document as read-only person.readonly? # => true person.name = "Larissa Shay" # Changes the document person.save # => raises ReadonlyDocument error person.reload.readonly? # => true このフラグが になっている場合は、
on
only
やwithout
などのメソッドを使用して、そのドキュメントをプロジェクト後、そのドキュメントを読み取り専用としてマークできます。その結果、Mongoid はReadonlyDocument
エラーを発生させるため、読み取り専用ドキュメントを削除または破棄することはできませんが、保存して更新することはできます。ドキュメントを再読み込みすると、読み取り専用ステータスはリセットされます。person = Person.only(:name).first person.readonly? # => true person.destroy # => raises ReadonlyDocument error person.reload.readonly? # => false
次のコードに示すように、readonly?
メソッドをオーバーライドしてドキュメントを読み取り専用にすることもできます。
class Person include Mongoid::Document field :name, type: String def readonly? true end end person = Person.first person.readonly? # => true person.destroy # => raises ReadonlyDocument error
詳細情報
クエリフィルターの指定の詳細については、「 クエリの指定 」ガイドを参照してください。