My Brain is Open.

思いついたことを適当に列列と

Mongoidのモデル間参照について備忘録

参照関係(Relation)を作るにはMongoidのモデルで以下を指定する。

  • references_one
  • references_mary
  • referenced_in

使い方に注意が必要で、例えば Parent, Childな関係の場合

class Parent
  include Mongoid::Document
  references_many :child
end

class Child
  include Mongoid::Document
  referenced_in :parent
end

という事になる。embed_many, embedded_in の関係と対比するとわかりやすいかも。
この時、普通のRDBだとChildテーブルにparent_idが入る点ではMongoDBも同じだが、Mongoidで違う点は、参照関係を作る際にEmbedを踏襲する点。
上記の例だと、こんな風になる。

@parent = Parent.new
@child = Child.new
@parent.child << @child
# @child.parent = @parent ではない

ちなみに、コメントアウトした方でもエラーにならない。しばらく迷ったのは秘密。

Parentを変更する場合は単純にもう一度実行する。

@parent_other = Parent.new
@parent_other.child << @child
@parent.child.first #=> nil

自動的に以前の @parent からは排除された形になる。