Docs Menu
Docs Home
/ / /
Mongoid
/

データ操作の実行

項目一覧

  • Overview
  • 作成操作
  • 作成します。
  • create
  • save!
  • 保存
  • 読み取り操作
  • 属性
  • 再読み込み
  • アップデート操作
  • update_attributes!
  • update_attributes
  • update_attribute
  • upsert
  • access
  • 削除操作
  • 削除
  • 破棄する
  • delete_all
  • delete_all
  • 永続性属性
  • new_record?
  • 永続化された場合
  • フィールド値にアクセス
  • フィールド値の取得と設定
  • read_attribute と write_attribute
  • 一括書込み (write) 属性
  • アトミックな更新演算子
  • グループ アトミック操作
  • ダーティ トラッキング
  • 変更を表示
  • 変更をリセット
  • 永続性
  • 以前の変更を表示
  • コンテナ フィールドの更新
  • 読み取り専用ドキュメント
  • 詳細情報

このガイドでは、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 は、重複する _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! は例外を発生させます。 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_errorfalse に設定されている場合に 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! を使用して既存のドキュメントの first_name 属性と last_name 属性を更新する方法を示します。

person.update_attributes!(
first_name: "Maximilian",
last_name: "Hjalmar"
)

Tip

Mongoid は、1 回の呼び出しでドキュメントとそのネストされた関連付けを更新できるネストされた属性機能を提供します。詳細については、「 ネストされた属性のガイド 」を参照してください。

update_attributes メソッドは検証エラーの例外を発生させません。このメソッドは、検証に合格し、ドキュメントが更新された場合は true を返し、そうでない場合は false を返します。

次の例は、 update_attributes の使用方法を示しています。

person.update_attributes(
first_name: "Hasan",
last_name: "Emine"
)

update_attributeメソッドを使用して検証をバイパスし、 モデルインスタンスの単一の属性を更新できます。

次の例では、 update_attribute を使用してドキュメントの first_name 属性の値を更新する方法を示しています。

person.update_attribute(:first_name, "Jean")

upsert メソッドを使用して、ドキュメント を更新、挿入、または置換できます。

upsertreplace オプションを受け入れます。このオプションを 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)

touch メソッドを使用して、ドキュメントの updated_at タイムスタンプを現在の時刻に更新できます。 touch は、ドキュメントの belongs_to 関連付けのいずれかへの更新をカスケードします。オプションとして別の時間値フィールドを渡して、そのフィールドを更新することもできます。

次の例では、 touch を使用して updated_ataudited_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 reloadunsaved_person.deleteperson_id エラーを発生させます。これは、2 つのドキュメントで の値が同じであるためです。

destroy メソッドは delete と同様に動作しますが、destroy を呼び出すと Mongoid がコールバックを実行します。ドキュメントがデータベースで見つからない場合、destroy は同じ _id を持つドキュメントを削除しようとします。

次の例は、 destroy の使用方法を示しています。

person.destroy

delete_all メソッドは、 Mongoid モデルクラスによってモデル化されているすべてのドキュメントをコレクションから削除します。 delete_all はコールバックを実行しません。

次の例は、 delete_all を使用してすべての Person ドキュメントを削除する方法を示しています。

Person.delete_all

destroy_all メソッドは、 Mongoid モデルクラスによってモデル化されているすべてのドキュメントをコレクションから削除します。 Mongoid はすべてのドキュメントをメモリにロードするため、これはコストのかかる操作になる可能性があります。

次の例は、 destroy_all を使用してすべての Person ドキュメントを削除する方法を示しています。

Person.destroy_all

次のセクションでは、ドキュメントがデータベースに保存されているかどうかを確認するために使用できる Mongoid が提供する属性について説明します。

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_attributewrite_attribute を使用して、fn 属性の読み取りと書込みに使用されるメソッドとして first_namefirst_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_attributewrite_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">

モデルインスタンスで 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 でサポートされている演算子を説明したものです。

演算子
説明

add_to_set

指定された値を配列値フィールドに追加します。

person.add_to_set(aliases: "Bond")

bit

フィールドのビット単位の更新を実行します。

person.bit(age: { and: 10, or: 12 })

inc

フィールドの値を増加させます。

person.inc(age: 1)

pop

配列フィールドの最初または最後の要素を削除します。

person.pop(aliases: 1)

pull

指定された条件に一致する値のすべてのインスタンスを、配列フィールドから削除します。

person.pull(aliases: "Bond")

pull_all

配列フィールドから指定された値のすべてのインスタンスを削除します。

person.pull_all(aliases: [ "Bond", "James" ])

push

指定された値を配列フィールドに追加します。

person.push(aliases: ["007","008"])

rename

一致するすべてのドキュメント内のフィールドの名前を変更します。

person.rename(bday: :dob)

set

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.
person = Person.create!(name: "Ricky Bobby")
# Updates `name` in the database
person.set(name: "Tyler Durden")

unset

一致するすべてのドキュメント内の特定のフィールドを削除します。

person.unset(:name)

更新演算子の詳細については、 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_contextfalse である最初のブロックのみがデータベースに変更を書き込みます。次の例では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 truemongoid.ymlファイルで 構成オプションを に設定します。 Mongoid 構成オプションの詳細については、「 自己管理型構成ファイル オプション 」を参照してください。

join_contextstrue にグローバルに設定すると、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フィールドを変更すると、変更が changeschanged_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 には現在、SetArray などのコンテナタイプの属性への変更を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 onlywithout などのメソッドを使用して、そのドキュメントをプロジェクト後、そのドキュメントを読み取り専用としてマークできます。その結果、Mongoid はReadonlyDocument エラーを発生させるため、読み取り専用ドキュメントを削除または破棄することはできませんが、保存して更新することはできます。ドキュメントを再読み込みすると、読み取り専用ステータスはリセットされます。

    person = Person.only(:name).first
    person.readonly? # => true
    person.destroy # => raises ReadonlyDocument error
    person.reload.readonly? # => false

    Tip

    プロジェクション

    プロジェクションの詳細については、「 クエリ結果の変更 」ガイドの「 指定されたフィールドの返却 」セクションを参照してください。

次のコードに示すように、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

クエリフィルターの指定の詳細については、「 クエリの指定 」ガイドを参照してください。

モデルに検証ルールを設定する方法の詳細については、 ドキュメント検証ガイドを参照してください。

コールバックの定義の詳細については、「 コールバックガイド 」を参照してください。

戻る

データのやり取り