mongoid 3.0.17 → 3.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +22 -0
 - data/lib/mongoid/contextual/aggregable/memory.rb +1 -1
 - data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
 - data/lib/mongoid/contextual/atomic.rb +11 -11
 - data/lib/mongoid/contextual/mongo.rb +2 -0
 - data/lib/mongoid/criteria.rb +49 -9
 - data/lib/mongoid/dirty.rb +1 -1
 - data/lib/mongoid/document.rb +1 -0
 - data/lib/mongoid/finders.rb +18 -43
 - data/lib/mongoid/matchers/strategies.rb +4 -4
 - data/lib/mongoid/validations/associated.rb +1 -1
 - data/lib/mongoid/version.rb +1 -1
 - metadata +2 -2
 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -3,6 +3,28 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            For instructions on upgrading to newer versions, visit
         
     | 
| 
       4 
4 
     | 
    
         
             
            [mongoid.org](http://mongoid.org/en/mongoid/docs/upgrading.html).
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
      
 6 
     | 
    
         
            +
            ## 3.0.18
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            ### Resolved Issues
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            * \#2703 Validations on associated documents on fire if the document is
         
     | 
| 
      
 11 
     | 
    
         
            +
              changed. (Regression)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            * \#2707 Calling `find_or_create_by` or `find_by_initialize_by` off a relation
         
     | 
| 
      
 14 
     | 
    
         
            +
              with a chained criteria or scope now properly keeps the relations intact on
         
     | 
| 
      
 15 
     | 
    
         
            +
              the new or found document.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            * \#2699 Resetting a field now removes the name from the changed attributes
         
     | 
| 
      
 18 
     | 
    
         
            +
              list. (Subhash Bhushan)
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            * \#2683 Aliased fields are now supported when executing atomic operations from
         
     | 
| 
      
 21 
     | 
    
         
            +
              criteria. (Arthur Neves)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            * \#2678 Calling `Criteria#sum` with no matching documents returns `0` instead
         
     | 
| 
      
 24 
     | 
    
         
            +
              of `nil`.
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            * \#2671 Matchers now correctly handle symbol keys. (Jonathan Hyman)
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       6 
28 
     | 
    
         
             
            ## 3.0.17
         
     | 
| 
       7 
29 
     | 
    
         | 
| 
       8 
30 
     | 
    
         
             
            ### Resolved Issues
         
     | 
| 
         @@ -15,7 +15,7 @@ module Mongoid 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  #
         
     | 
| 
       16 
16 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       17 
17 
     | 
    
         
             
                  def add_to_set(field, value)
         
     | 
| 
       18 
     | 
    
         
            -
                    query.update_all("$addToSet" => { field => value })
         
     | 
| 
      
 18 
     | 
    
         
            +
                    query.update_all("$addToSet" => { database_field_name(field) => value })
         
     | 
| 
       19 
19 
     | 
    
         
             
                  end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                  # Perform an atomic $bit operation on the matching documents.
         
     | 
| 
         @@ -31,7 +31,7 @@ module Mongoid 
     | 
|
| 
       31 
31 
     | 
    
         
             
                  #
         
     | 
| 
       32 
32 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       33 
33 
     | 
    
         
             
                  def bit(field, value)
         
     | 
| 
       34 
     | 
    
         
            -
                    query.update_all("$bit" => { field => value })
         
     | 
| 
      
 34 
     | 
    
         
            +
                    query.update_all("$bit" => { database_field_name(field) => value })
         
     | 
| 
       35 
35 
     | 
    
         
             
                  end
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                  # Perform an atomic $inc operation on the matching documents.
         
     | 
| 
         @@ -46,7 +46,7 @@ module Mongoid 
     | 
|
| 
       46 
46 
     | 
    
         
             
                  #
         
     | 
| 
       47 
47 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       48 
48 
     | 
    
         
             
                  def inc(field, value)
         
     | 
| 
       49 
     | 
    
         
            -
                    query.update_all("$inc" => { field => value })
         
     | 
| 
      
 49 
     | 
    
         
            +
                    query.update_all("$inc" => { database_field_name(field) => value })
         
     | 
| 
       50 
50 
     | 
    
         
             
                  end
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
52 
     | 
    
         
             
                  # Perform an atomic $pop operation on the matching documents.
         
     | 
| 
         @@ -66,7 +66,7 @@ module Mongoid 
     | 
|
| 
       66 
66 
     | 
    
         
             
                  #
         
     | 
| 
       67 
67 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       68 
68 
     | 
    
         
             
                  def pop(field, value)
         
     | 
| 
       69 
     | 
    
         
            -
                    query.update_all("$pop" => { field => value })
         
     | 
| 
      
 69 
     | 
    
         
            +
                    query.update_all("$pop" => { database_field_name(field) => value })
         
     | 
| 
       70 
70 
     | 
    
         
             
                  end
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
       72 
72 
     | 
    
         
             
                  # Perform an atomic $pull operation on the matching documents.
         
     | 
| 
         @@ -83,7 +83,7 @@ module Mongoid 
     | 
|
| 
       83 
83 
     | 
    
         
             
                  #
         
     | 
| 
       84 
84 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       85 
85 
     | 
    
         
             
                  def pull(field, value)
         
     | 
| 
       86 
     | 
    
         
            -
                    query.update_all("$pull" => { field => value })
         
     | 
| 
      
 86 
     | 
    
         
            +
                    query.update_all("$pull" => { database_field_name(field) => value })
         
     | 
| 
       87 
87 
     | 
    
         
             
                  end
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
                  # Perform an atomic $pullAll operation on the matching documents.
         
     | 
| 
         @@ -98,7 +98,7 @@ module Mongoid 
     | 
|
| 
       98 
98 
     | 
    
         
             
                  #
         
     | 
| 
       99 
99 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       100 
100 
     | 
    
         
             
                  def pull_all(field, values)
         
     | 
| 
       101 
     | 
    
         
            -
                    query.update_all("$pullAll" => { field => values })
         
     | 
| 
      
 101 
     | 
    
         
            +
                    query.update_all("$pullAll" => { database_field_name(field) => values })
         
     | 
| 
       102 
102 
     | 
    
         
             
                  end
         
     | 
| 
       103 
103 
     | 
    
         | 
| 
       104 
104 
     | 
    
         
             
                  # Perform an atomic $push operation on the matching documents.
         
     | 
| 
         @@ -113,7 +113,7 @@ module Mongoid 
     | 
|
| 
       113 
113 
     | 
    
         
             
                  #
         
     | 
| 
       114 
114 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       115 
115 
     | 
    
         
             
                  def push(field, value)
         
     | 
| 
       116 
     | 
    
         
            -
                    query.update_all("$push" => { field => value })
         
     | 
| 
      
 116 
     | 
    
         
            +
                    query.update_all("$push" => { database_field_name(field) => value })
         
     | 
| 
       117 
117 
     | 
    
         
             
                  end
         
     | 
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                  # Perform an atomic $pushAll operation on the matching documents.
         
     | 
| 
         @@ -128,7 +128,7 @@ module Mongoid 
     | 
|
| 
       128 
128 
     | 
    
         
             
                  #
         
     | 
| 
       129 
129 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       130 
130 
     | 
    
         
             
                  def push_all(field, values)
         
     | 
| 
       131 
     | 
    
         
            -
                    query.update_all("$pushAll" => { field => values })
         
     | 
| 
      
 131 
     | 
    
         
            +
                    query.update_all("$pushAll" => { database_field_name(field) => values })
         
     | 
| 
       132 
132 
     | 
    
         
             
                  end
         
     | 
| 
       133 
133 
     | 
    
         | 
| 
       134 
134 
     | 
    
         
             
                  # Perform an atomic $rename of fields on the matching documents.
         
     | 
| 
         @@ -143,7 +143,7 @@ module Mongoid 
     | 
|
| 
       143 
143 
     | 
    
         
             
                  #
         
     | 
| 
       144 
144 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       145 
145 
     | 
    
         
             
                  def rename(old_name, new_name)
         
     | 
| 
       146 
     | 
    
         
            -
                    query.update_all("$rename" => { old_name 
     | 
| 
      
 146 
     | 
    
         
            +
                    query.update_all("$rename" => { database_field_name(old_name) => new_name.to_s })
         
     | 
| 
       147 
147 
     | 
    
         
             
                  end
         
     | 
| 
       148 
148 
     | 
    
         | 
| 
       149 
149 
     | 
    
         
             
                  # Perform an atomic $set of fields on the matching documents.
         
     | 
| 
         @@ -158,7 +158,7 @@ module Mongoid 
     | 
|
| 
       158 
158 
     | 
    
         
             
                  #
         
     | 
| 
       159 
159 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       160 
160 
     | 
    
         
             
                  def set(field, value)
         
     | 
| 
       161 
     | 
    
         
            -
                    query.update_all("$set" => { field => value })
         
     | 
| 
      
 161 
     | 
    
         
            +
                    query.update_all("$set" => { database_field_name(field) => value })
         
     | 
| 
       162 
162 
     | 
    
         
             
                  end
         
     | 
| 
       163 
163 
     | 
    
         | 
| 
       164 
164 
     | 
    
         
             
                  # Perform an atomic $unset of a field on the matching documents.
         
     | 
| 
         @@ -172,7 +172,7 @@ module Mongoid 
     | 
|
| 
       172 
172 
     | 
    
         
             
                  #
         
     | 
| 
       173 
173 
     | 
    
         
             
                  # @since 3.0.0
         
     | 
| 
       174 
174 
     | 
    
         
             
                  def unset(field)
         
     | 
| 
       175 
     | 
    
         
            -
                    query.update_all("$unset" => { field => true })
         
     | 
| 
      
 175 
     | 
    
         
            +
                    query.update_all("$unset" => { database_field_name(field) => true })
         
     | 
| 
       176 
176 
     | 
    
         
             
                  end
         
     | 
| 
       177 
177 
     | 
    
         
             
                end
         
     | 
| 
       178 
178 
     | 
    
         
             
              end
         
     | 
    
        data/lib/mongoid/criteria.rb
    CHANGED
    
    | 
         @@ -60,8 +60,8 @@ module Mongoid 
     | 
|
| 
       60 
60 
     | 
    
         
             
                # @return [ Document ] A non-persisted document.
         
     | 
| 
       61 
61 
     | 
    
         
             
                #
         
     | 
| 
       62 
62 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       63 
     | 
    
         
            -
                def build(attrs = {})
         
     | 
| 
       64 
     | 
    
         
            -
                  create_document(:new, attrs)
         
     | 
| 
      
 63 
     | 
    
         
            +
                def build(attrs = {}, &block)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  create_document(:new, attrs, &block)
         
     | 
| 
       65 
65 
     | 
    
         
             
                end
         
     | 
| 
       66 
66 
     | 
    
         
             
                alias :new :build
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
         @@ -102,8 +102,8 @@ module Mongoid 
     | 
|
| 
       102 
102 
     | 
    
         
             
                # @return [ Document ] A newly created document.
         
     | 
| 
       103 
103 
     | 
    
         
             
                #
         
     | 
| 
       104 
104 
     | 
    
         
             
                # @since 2.0.0.rc.1
         
     | 
| 
       105 
     | 
    
         
            -
                def create(attrs = {})
         
     | 
| 
       106 
     | 
    
         
            -
                  create_document(:create, attrs)
         
     | 
| 
      
 105 
     | 
    
         
            +
                def create(attrs = {}, &block)
         
     | 
| 
      
 106 
     | 
    
         
            +
                  create_document(:create, attrs, &block)
         
     | 
| 
       107 
107 
     | 
    
         
             
                end
         
     | 
| 
       108 
108 
     | 
    
         | 
| 
       109 
109 
     | 
    
         
             
                # Create a document in the database given the selector and return it.
         
     | 
| 
         @@ -121,8 +121,8 @@ module Mongoid 
     | 
|
| 
       121 
121 
     | 
    
         
             
                # @return [ Document ] A newly created document.
         
     | 
| 
       122 
122 
     | 
    
         
             
                #
         
     | 
| 
       123 
123 
     | 
    
         
             
                # @since 3.0.0
         
     | 
| 
       124 
     | 
    
         
            -
                def create!(attrs = {})
         
     | 
| 
       125 
     | 
    
         
            -
                  create_document(:create!, attrs)
         
     | 
| 
      
 124 
     | 
    
         
            +
                def create!(attrs = {}, &block)
         
     | 
| 
      
 125 
     | 
    
         
            +
                  create_document(:create!, attrs, &block)
         
     | 
| 
       126 
126 
     | 
    
         
             
                end
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
       128 
128 
     | 
    
         
             
                # Get the documents from the embedded criteria.
         
     | 
| 
         @@ -245,6 +245,32 @@ module Mongoid 
     | 
|
| 
       245 
245 
     | 
    
         
             
                  for_ids(ids).execute_or_raise(ids, args.multi_arged?)
         
     | 
| 
       246 
246 
     | 
    
         
             
                end
         
     | 
| 
       247 
247 
     | 
    
         | 
| 
      
 248 
     | 
    
         
            +
                # Find the first +Document+ given the conditions, or creates a new document
         
     | 
| 
      
 249 
     | 
    
         
            +
                # with the conditions that were supplied.
         
     | 
| 
      
 250 
     | 
    
         
            +
                #
         
     | 
| 
      
 251 
     | 
    
         
            +
                # @example Find or create the document.
         
     | 
| 
      
 252 
     | 
    
         
            +
                #   Person.find_or_create_by(:attribute => "value")
         
     | 
| 
      
 253 
     | 
    
         
            +
                #
         
     | 
| 
      
 254 
     | 
    
         
            +
                # @param [ Hash ] attrs The attributes to check.
         
     | 
| 
      
 255 
     | 
    
         
            +
                #
         
     | 
| 
      
 256 
     | 
    
         
            +
                # @return [ Document ] A matching or newly created document.
         
     | 
| 
      
 257 
     | 
    
         
            +
                def find_or_create_by(attrs = {}, &block)
         
     | 
| 
      
 258 
     | 
    
         
            +
                  find_or(:create, attrs, &block)
         
     | 
| 
      
 259 
     | 
    
         
            +
                end
         
     | 
| 
      
 260 
     | 
    
         
            +
             
     | 
| 
      
 261 
     | 
    
         
            +
                # Find the first +Document+ given the conditions, or initializes a new document
         
     | 
| 
      
 262 
     | 
    
         
            +
                # with the conditions that were supplied.
         
     | 
| 
      
 263 
     | 
    
         
            +
                #
         
     | 
| 
      
 264 
     | 
    
         
            +
                # @example Find or initialize the document.
         
     | 
| 
      
 265 
     | 
    
         
            +
                #   Person.find_or_initialize_by(:attribute => "value")
         
     | 
| 
      
 266 
     | 
    
         
            +
                #
         
     | 
| 
      
 267 
     | 
    
         
            +
                # @param [ Hash ] attrs The attributes to check.
         
     | 
| 
      
 268 
     | 
    
         
            +
                #
         
     | 
| 
      
 269 
     | 
    
         
            +
                # @return [ Document ] A matching or newly initialized document.
         
     | 
| 
      
 270 
     | 
    
         
            +
                def find_or_initialize_by(attrs = {}, &block)
         
     | 
| 
      
 271 
     | 
    
         
            +
                  find_or(:new, attrs, &block)
         
     | 
| 
      
 272 
     | 
    
         
            +
                end
         
     | 
| 
      
 273 
     | 
    
         
            +
             
     | 
| 
       248 
274 
     | 
    
         
             
                # Adds a criterion to the +Criteria+ that specifies an id that must be matched.
         
     | 
| 
       249 
275 
     | 
    
         
             
                #
         
     | 
| 
       250 
276 
     | 
    
         
             
                # @example Add a single id criteria.
         
     | 
| 
         @@ -600,15 +626,29 @@ module Mongoid 
     | 
|
| 
       600 
626 
     | 
    
         
             
                # @return [ Document ] The new or saved document.
         
     | 
| 
       601 
627 
     | 
    
         
             
                #
         
     | 
| 
       602 
628 
     | 
    
         
             
                # @since 3.0.0
         
     | 
| 
       603 
     | 
    
         
            -
                def create_document(method, attrs = {})
         
     | 
| 
      
 629 
     | 
    
         
            +
                def create_document(method, attrs = {}, &block)
         
     | 
| 
       604 
630 
     | 
    
         
             
                  klass.__send__(method,
         
     | 
| 
       605 
631 
     | 
    
         
             
                    selector.reduce(attrs) do |hash, (key, value)|
         
     | 
| 
       606 
632 
     | 
    
         
             
                      unless key.to_s =~ /\$/ || value.is_a?(Hash)
         
     | 
| 
       607 
633 
     | 
    
         
             
                        hash[key] = value
         
     | 
| 
       608 
634 
     | 
    
         
             
                      end
         
     | 
| 
       609 
635 
     | 
    
         
             
                      hash
         
     | 
| 
       610 
     | 
    
         
            -
                    end
         
     | 
| 
       611 
     | 
    
         
            -
             
     | 
| 
      
 636 
     | 
    
         
            +
                    end, &block)
         
     | 
| 
      
 637 
     | 
    
         
            +
                end
         
     | 
| 
      
 638 
     | 
    
         
            +
             
     | 
| 
      
 639 
     | 
    
         
            +
                # Find the first object or create/initialize it.
         
     | 
| 
      
 640 
     | 
    
         
            +
                #
         
     | 
| 
      
 641 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 642 
     | 
    
         
            +
                #
         
     | 
| 
      
 643 
     | 
    
         
            +
                # @example Find or perform an action.
         
     | 
| 
      
 644 
     | 
    
         
            +
                #   Person.find_or(:create, :name => "Dev")
         
     | 
| 
      
 645 
     | 
    
         
            +
                #
         
     | 
| 
      
 646 
     | 
    
         
            +
                # @param [ Symbol ] method The method to invoke.
         
     | 
| 
      
 647 
     | 
    
         
            +
                # @param [ Hash ] attrs The attributes to query or set.
         
     | 
| 
      
 648 
     | 
    
         
            +
                #
         
     | 
| 
      
 649 
     | 
    
         
            +
                # @return [ Document ] The first or new document.
         
     | 
| 
      
 650 
     | 
    
         
            +
                def find_or(method, attrs = {}, &block)
         
     | 
| 
      
 651 
     | 
    
         
            +
                  where(attrs).first || send(method, attrs, &block)
         
     | 
| 
       612 
652 
     | 
    
         
             
                end
         
     | 
| 
       613 
653 
     | 
    
         | 
| 
       614 
654 
     | 
    
         
             
                # Clone or dup the current +Criteria+. This will return a new criteria with
         
     | 
    
        data/lib/mongoid/dirty.rb
    CHANGED
    
    | 
         @@ -239,7 +239,7 @@ module Mongoid 
     | 
|
| 
       239 
239 
     | 
    
         
             
                #
         
     | 
| 
       240 
240 
     | 
    
         
             
                # @since 2.4.0
         
     | 
| 
       241 
241 
     | 
    
         
             
                def reset_attribute!(attr)
         
     | 
| 
       242 
     | 
    
         
            -
                  attributes[attr] = changed_attributes 
     | 
| 
      
 242 
     | 
    
         
            +
                  attributes[attr] = changed_attributes.delete(attr) if attribute_changed?(attr)
         
     | 
| 
       243 
243 
     | 
    
         
             
                end
         
     | 
| 
       244 
244 
     | 
    
         | 
| 
       245 
245 
     | 
    
         
             
                module ClassMethods
         
     | 
    
        data/lib/mongoid/document.rb
    CHANGED
    
    | 
         @@ -337,6 +337,7 @@ module Mongoid 
     | 
|
| 
       337 
337 
     | 
    
         
             
                    doc.instance_variable_set(:@attributes, attributes)
         
     | 
| 
       338 
338 
     | 
    
         
             
                    doc.apply_defaults
         
     | 
| 
       339 
339 
     | 
    
         
             
                    IdentityMap.set(doc) unless _loading_revision?
         
     | 
| 
      
 340 
     | 
    
         
            +
                    yield(doc) if block_given?
         
     | 
| 
       340 
341 
     | 
    
         
             
                    doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
         
     | 
| 
       341 
342 
     | 
    
         
             
                    doc
         
     | 
| 
       342 
343 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/mongoid/finders.rb
    CHANGED
    
    | 
         @@ -7,8 +7,24 @@ module Mongoid 
     | 
|
| 
       7 
7 
     | 
    
         
             
                extend Origin::Forwardable
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                select_with :with_default_scope
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                # These are methods defined on the criteria that should also be accessible
         
     | 
| 
      
 12 
     | 
    
         
            +
                # directly from the the class level.
         
     | 
| 
      
 13 
     | 
    
         
            +
                delegate \
         
     | 
| 
      
 14 
     | 
    
         
            +
                  :aggregates,
         
     | 
| 
      
 15 
     | 
    
         
            +
                  :avg,
         
     | 
| 
      
 16 
     | 
    
         
            +
                  :each,
         
     | 
| 
      
 17 
     | 
    
         
            +
                  :extras,
         
     | 
| 
      
 18 
     | 
    
         
            +
                  :find_and_modify,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  :find_or_create_by,
         
     | 
| 
      
 20 
     | 
    
         
            +
                  :find_or_initialize_by,
         
     | 
| 
      
 21 
     | 
    
         
            +
                  :includes,
         
     | 
| 
      
 22 
     | 
    
         
            +
                  :map_reduce,
         
     | 
| 
      
 23 
     | 
    
         
            +
                  :max,
         
     | 
| 
      
 24 
     | 
    
         
            +
                  :min,
         
     | 
| 
      
 25 
     | 
    
         
            +
                  :sum,
         
     | 
| 
      
 26 
     | 
    
         
            +
                  :update,
         
     | 
| 
      
 27 
     | 
    
         
            +
                  :update_all, to: :with_default_scope
         
     | 
| 
       12 
28 
     | 
    
         | 
| 
       13 
29 
     | 
    
         
             
                # Returns a count of records in the database.
         
     | 
| 
       14 
30 
     | 
    
         
             
                # If you want to specify conditions use where.
         
     | 
| 
         @@ -61,32 +77,6 @@ module Mongoid 
     | 
|
| 
       61 
77 
     | 
    
         
             
                  with_default_scope.find(*args)
         
     | 
| 
       62 
78 
     | 
    
         
             
                end
         
     | 
| 
       63 
79 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
                # Find the first +Document+ given the conditions, or creates a new document
         
     | 
| 
       65 
     | 
    
         
            -
                # with the conditions that were supplied.
         
     | 
| 
       66 
     | 
    
         
            -
                #
         
     | 
| 
       67 
     | 
    
         
            -
                # @example Find or create the document.
         
     | 
| 
       68 
     | 
    
         
            -
                #   Person.find_or_create_by(:attribute => "value")
         
     | 
| 
       69 
     | 
    
         
            -
                #
         
     | 
| 
       70 
     | 
    
         
            -
                # @param [ Hash ] attrs The attributes to check.
         
     | 
| 
       71 
     | 
    
         
            -
                #
         
     | 
| 
       72 
     | 
    
         
            -
                # @return [ Document ] A matching or newly created document.
         
     | 
| 
       73 
     | 
    
         
            -
                def find_or_create_by(attrs = {}, &block)
         
     | 
| 
       74 
     | 
    
         
            -
                  find_or(:create, attrs, &block)
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                # Find the first +Document+ given the conditions, or initializes a new document
         
     | 
| 
       78 
     | 
    
         
            -
                # with the conditions that were supplied.
         
     | 
| 
       79 
     | 
    
         
            -
                #
         
     | 
| 
       80 
     | 
    
         
            -
                # @example Find or initialize the document.
         
     | 
| 
       81 
     | 
    
         
            -
                #   Person.find_or_initialize_by(:attribute => "value")
         
     | 
| 
       82 
     | 
    
         
            -
                #
         
     | 
| 
       83 
     | 
    
         
            -
                # @param [ Hash ] attrs The attributes to check.
         
     | 
| 
       84 
     | 
    
         
            -
                #
         
     | 
| 
       85 
     | 
    
         
            -
                # @return [ Document ] A matching or newly initialized document.
         
     | 
| 
       86 
     | 
    
         
            -
                def find_or_initialize_by(attrs = {}, &block)
         
     | 
| 
       87 
     | 
    
         
            -
                  find_or(:new, attrs, &block)
         
     | 
| 
       88 
     | 
    
         
            -
                end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
80 
     | 
    
         
             
                # Find the first +Document+ given the conditions, or raises
         
     | 
| 
       91 
81 
     | 
    
         
             
                # Mongoid::Errors::DocumentNotFound
         
     | 
| 
       92 
82 
     | 
    
         
             
                #
         
     | 
| 
         @@ -128,20 +118,5 @@ module Mongoid 
     | 
|
| 
       128 
118 
     | 
    
         
             
                def last
         
     | 
| 
       129 
119 
     | 
    
         
             
                  with_default_scope.last
         
     | 
| 
       130 
120 
     | 
    
         
             
                end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                protected
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
                # Find the first object or create/initialize it.
         
     | 
| 
       135 
     | 
    
         
            -
                #
         
     | 
| 
       136 
     | 
    
         
            -
                # @example Find or perform an action.
         
     | 
| 
       137 
     | 
    
         
            -
                #   Person.find_or(:create, :name => "Dev")
         
     | 
| 
       138 
     | 
    
         
            -
                #
         
     | 
| 
       139 
     | 
    
         
            -
                # @param [ Symbol ] method The method to invoke.
         
     | 
| 
       140 
     | 
    
         
            -
                # @param [ Hash ] attrs The attributes to query or set.
         
     | 
| 
       141 
     | 
    
         
            -
                #
         
     | 
| 
       142 
     | 
    
         
            -
                # @return [ Document ] The first or new document.
         
     | 
| 
       143 
     | 
    
         
            -
                def find_or(method, attrs = {}, &block)
         
     | 
| 
       144 
     | 
    
         
            -
                  where(attrs).first || send(method, attrs, &block)
         
     | 
| 
       145 
     | 
    
         
            -
                end
         
     | 
| 
       146 
121 
     | 
    
         
             
              end
         
     | 
| 
       147 
122 
     | 
    
         
             
            end
         
     | 
| 
         @@ -21,7 +21,7 @@ module Mongoid 
     | 
|
| 
       21 
21 
     | 
    
         
             
                module Strategies
         
     | 
| 
       22 
22 
     | 
    
         
             
                  extend self
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                  MATCHERS = {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  MATCHERS = HashWithIndifferentAccess.new({
         
     | 
| 
       25 
25 
     | 
    
         
             
                    "$all" => Matchers::All,
         
     | 
| 
       26 
26 
     | 
    
         
             
                    "$and" => Matchers::And,
         
     | 
| 
       27 
27 
     | 
    
         
             
                    "$exists" => Matchers::Exists,
         
     | 
| 
         @@ -34,7 +34,7 @@ module Mongoid 
     | 
|
| 
       34 
34 
     | 
    
         
             
                    "$nin" => Matchers::Nin,
         
     | 
| 
       35 
35 
     | 
    
         
             
                    "$or" => Matchers::Or,
         
     | 
| 
       36 
36 
     | 
    
         
             
                    "$size" => Matchers::Size
         
     | 
| 
       37 
     | 
    
         
            -
                  }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  })
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
                  # Get the matcher for the supplied key and value. Will determine the class
         
     | 
| 
       40 
40 
     | 
    
         
             
                  # name from the key.
         
     | 
| 
         @@ -59,8 +59,8 @@ module Mongoid 
     | 
|
| 
       59 
59 
     | 
    
         
             
                      end
         
     | 
| 
       60 
60 
     | 
    
         
             
                    else
         
     | 
| 
       61 
61 
     | 
    
         
             
                      case key
         
     | 
| 
       62 
     | 
    
         
            -
                        when "$or" then Matchers::Or.new(value, document)
         
     | 
| 
       63 
     | 
    
         
            -
                        when "$and" then Matchers::And.new(value, document)
         
     | 
| 
      
 62 
     | 
    
         
            +
                        when "$or", :$or then Matchers::Or.new(value, document)
         
     | 
| 
      
 63 
     | 
    
         
            +
                        when "$and", :$and then Matchers::And.new(value, document)
         
     | 
| 
       64 
64 
     | 
    
         
             
                        else Default.new(extract_attribute(document, key))
         
     | 
| 
       65 
65 
     | 
    
         
             
                      end
         
     | 
| 
       66 
66 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/mongoid/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mongoid
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 3.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 3.0.18
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2013-01- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2013-01-20 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: activemodel
         
     |