Mongoidでdependentが無視される

Mongoidでdependentが無視される時、primary_keyが片方だけ指定されていて検索に失敗している場合がある

以下の擬似コードのような状況で動かないなーって思ったら、

class User
  include Mongoid::Document
  field :user_id, type: String
  has_many :pictures, dependent: :destroy
end

class Picture
  include Mongoid::Document
  belongs_to :user, primary_key: :user_id
end

has_many側にprimary_keyを付け忘れていた

class User
  include Mongoid::Document
  field :user_id, type: String
  has_many :pictures, primary_key: :user_id, dependent: :destroy
end

class Picture
  include Mongoid::Document
  belongs_to :user, primary_key: :user_id
end

Mongoidのany_ofがorではなくandになる

any_ofでorの結果を取得したいのに、結果はandになってしまう、という場合

User.any_of(:created_at.gte => 1.week.ago, :name => /^j/)

上記のコードは、1つのハッシュをany_ofとして渡している。any_ofはハッシュを複数渡すのが正解なので、以下のコードが正しい。

User.any_of({:created_at.gte => 1.week.ago}, {:name => /^j/})

よくミスするのでメモ。

Mongoidでcallback(before_save等)を呼ばずにupdateする

before_save, after_saveといったコールバックを実行せずにフィールドの値を更新するには、setメソッドを利用する。after_saveの中で値を更新したい時に便利。
以下は例。

item = Item.first
item.set(:description, "It's so nice!")

簡単ですね。

http://mongoid.org/en/mongoid/docs/persistence.html#atomic