-
Type: Task
-
Resolution: Done
-
Affects Version/s: None
-
Component/s: None
Hello!
I came across some strange behavior when using Mongoid criteria with custom scopes. I have the two following scopes defined for a mongoid document:
class Author include Mongoid::Document identity type: Integer scope :for_ids, ->(author_ids) { where(:_id.in => author_ids) } scope :sort_fields, -> { only([:_id, :name]) } end
Now, when I search authors for a set of ids using scope and use another scope, the criteria becomes weird leading to zero results:
# this is OK 1.9.3p0 :030 > Author.for_ids([39620832, 219395552]) => #<Mongoid::Criteria selector: {:_id=>{"$in"=>[39620832, 219395552]}}, options: {}, class: Author, embedded: false> # this leads to zero results (note the ids condition is doubled) 1.9.3p0 :031 > Author.for_ids([39620832, 219395552]).sort_fields => #<Mongoid::Criteria selector: {"$and"=>[{:_id=>{"$in"=>[39620832, 219395552]}}, {:_id=>{"$in"=>[39620832, 219395552]}}]}, options: {:fields=>{:_type=>1, :_id=>1, :name=>1}}, class: Author, embedded: false>
However, if I put the scope dealing with ids last in the chain, everything is back to normal:
# OK again 1.9.3p0 :032 > Author.sort_fields.for_ids([39620832, 219395552]) => #<Mongoid::Criteria selector: {:_id=>{"$in"=>[39620832, 219395552]}}, options: {:fields=>{:_type=>1, :_id=>1, :name=>1}}, class: Author, embedded: false>
This bug only appears when the scope with the where condition somehow deals with the main document _id. For other fields, everything seems to be OK. Any thoughts?
Thanks for the wonderful gem!
Gemfile:
gem 'rails', '3.2.1'
gem 'mongoid', '~> 2.4'