前提
- BlogモデルとUserモデルがある
- BlogはUserにbelogs_toの関係
- Blogのデータに対してUserが存在するデータだけを検索したい場合
落とし穴
mongoidの Blog.where(user: { '$exists' => true }
は
フィールドが存在したら無条件で値を取ってきてしまうので、
nilチェックはそのあとの処理で行う必要があるということを知りませんでしたw
対応方法(2つ)
- 後続処理でnilチェックを行う
Blog.where(user: { '$exists' => true, '$ne' => nil })
で検索する
field.exists => trueだと大丈夫っぽい...
{ '$exists' => true }はmongoidというより、
MongoDBのクエリとして吐かれるっぽく?たぶんnilをチェックしてくれないっぽい予感...
なので、このケースだとたぶん正常に値は取れそう...
Member.where(:status.exists => true)
たぶんActiveRecordを経由しないで
SQLを直打ちすると今回のようなことが起こりそうだなと
ActiveRecordを普段業務で使ってないRailsエンジニアとして想像してしまいました。