mongomodel 0.5.5 → 0.5.6

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.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +23 -11
  3. data/gemfiles/rails-3.2.gemfile +2 -2
  4. data/gemfiles/rails-4-observers.gemfile +1 -1
  5. data/gemfiles/rails-4.1.gemfile +2 -2
  6. data/gemfiles/{mongoid.gemfile → rails-4.2.gemfile} +2 -3
  7. data/gemfiles/{mongo_mapper.gemfile → rails-5.0.gemfile} +2 -3
  8. data/gemfiles/rails-5.1.gemfile +10 -0
  9. data/gemfiles/rails-5.2.gemfile +10 -0
  10. data/lib/mongomodel.rb +15 -15
  11. data/lib/mongomodel/attributes/mongo.rb +7 -7
  12. data/lib/mongomodel/attributes/store.rb +4 -4
  13. data/lib/mongomodel/attributes/typecasting.rb +7 -7
  14. data/lib/mongomodel/compatibility/mongo_mapper.rb +3 -3
  15. data/lib/mongomodel/compatibility/mongoid.rb +3 -3
  16. data/lib/mongomodel/concerns/abstract_class.rb +3 -3
  17. data/lib/mongomodel/concerns/activemodel.rb +4 -4
  18. data/lib/mongomodel/concerns/associations.rb +8 -8
  19. data/lib/mongomodel/concerns/associations/base/association.rb +5 -5
  20. data/lib/mongomodel/concerns/associations/base/definition.rb +4 -4
  21. data/lib/mongomodel/concerns/associations/base/proxy.rb +1 -1
  22. data/lib/mongomodel/concerns/associations/belongs_to.rb +19 -19
  23. data/lib/mongomodel/concerns/associations/has_many_by_foreign_key.rb +36 -36
  24. data/lib/mongomodel/concerns/associations/has_many_by_ids.rb +34 -34
  25. data/lib/mongomodel/concerns/attribute_methods.rb +10 -10
  26. data/lib/mongomodel/concerns/attribute_methods/before_type_cast.rb +4 -4
  27. data/lib/mongomodel/concerns/attribute_methods/dirty.rb +95 -13
  28. data/lib/mongomodel/concerns/attribute_methods/forbidden.rb +1 -1
  29. data/lib/mongomodel/concerns/attribute_methods/multi_parameter_assignment.rb +6 -6
  30. data/lib/mongomodel/concerns/attribute_methods/nested.rb +18 -18
  31. data/lib/mongomodel/concerns/attribute_methods/protected.rb +3 -3
  32. data/lib/mongomodel/concerns/attribute_methods/query.rb +3 -3
  33. data/lib/mongomodel/concerns/attribute_methods/read.rb +4 -4
  34. data/lib/mongomodel/concerns/attribute_methods/write.rb +4 -4
  35. data/lib/mongomodel/concerns/attributes.rb +18 -18
  36. data/lib/mongomodel/concerns/callbacks.rb +7 -7
  37. data/lib/mongomodel/concerns/document_parent.rb +2 -2
  38. data/lib/mongomodel/concerns/logging.rb +2 -2
  39. data/lib/mongomodel/concerns/map_reduce.rb +11 -11
  40. data/lib/mongomodel/concerns/pretty_inspect.rb +3 -3
  41. data/lib/mongomodel/concerns/properties.rb +18 -18
  42. data/lib/mongomodel/concerns/record_status.rb +9 -13
  43. data/lib/mongomodel/concerns/serialization.rb +4 -4
  44. data/lib/mongomodel/concerns/timestamps.rb +4 -4
  45. data/lib/mongomodel/concerns/translation.rb +2 -2
  46. data/lib/mongomodel/concerns/validations.rb +5 -5
  47. data/lib/mongomodel/concerns/validations/associated.rb +1 -1
  48. data/lib/mongomodel/document.rb +6 -6
  49. data/lib/mongomodel/document/callbacks.rb +15 -21
  50. data/lib/mongomodel/document/collection_modifiers.rb +5 -5
  51. data/lib/mongomodel/document/dynamic_finders.rb +1 -1
  52. data/lib/mongomodel/document/indexes.rb +19 -19
  53. data/lib/mongomodel/document/optimistic_locking.rb +7 -7
  54. data/lib/mongomodel/document/persistence.rb +23 -23
  55. data/lib/mongomodel/document/scopes.rb +20 -20
  56. data/lib/mongomodel/document/validations.rb +6 -6
  57. data/lib/mongomodel/document/validations/uniqueness.rb +11 -11
  58. data/lib/mongomodel/embedded_document.rb +11 -11
  59. data/lib/mongomodel/locale/en.yml +0 -1
  60. data/lib/mongomodel/log_subscriber.rb +5 -5
  61. data/lib/mongomodel/railtie.rb +13 -13
  62. data/lib/mongomodel/support/collection.rb +31 -31
  63. data/lib/mongomodel/support/configuration.rb +11 -11
  64. data/lib/mongomodel/support/core_extensions.rb +1 -1
  65. data/lib/mongomodel/support/dynamic_finder.rb +12 -12
  66. data/lib/mongomodel/support/exceptions.rb +6 -6
  67. data/lib/mongomodel/support/instrumented_collection.rb +20 -20
  68. data/lib/mongomodel/support/map.rb +33 -33
  69. data/lib/mongomodel/support/mongo_operator.rb +6 -6
  70. data/lib/mongomodel/support/mongo_options.rb +18 -18
  71. data/lib/mongomodel/support/mongo_order.rb +16 -16
  72. data/lib/mongomodel/support/paginator.rb +8 -8
  73. data/lib/mongomodel/support/reference.rb +10 -10
  74. data/lib/mongomodel/support/scope.rb +37 -37
  75. data/lib/mongomodel/support/scope/array_methods.rb +1 -1
  76. data/lib/mongomodel/support/scope/batches.rb +1 -1
  77. data/lib/mongomodel/support/scope/dynamic_finders.rb +1 -1
  78. data/lib/mongomodel/support/scope/finder_methods.rb +7 -7
  79. data/lib/mongomodel/support/scope/load_methods.rb +1 -1
  80. data/lib/mongomodel/support/scope/pagination.rb +1 -1
  81. data/lib/mongomodel/support/scope/query_methods.rb +6 -6
  82. data/lib/mongomodel/support/scope/spawn_methods.rb +8 -8
  83. data/lib/mongomodel/support/types.rb +2 -2
  84. data/lib/mongomodel/support/types/array.rb +1 -1
  85. data/lib/mongomodel/support/types/boolean.rb +3 -3
  86. data/lib/mongomodel/support/types/custom.rb +3 -3
  87. data/lib/mongomodel/support/types/date.rb +2 -2
  88. data/lib/mongomodel/support/types/date_time.rb +6 -16
  89. data/lib/mongomodel/support/types/float.rb +1 -1
  90. data/lib/mongomodel/support/types/hash.rb +1 -1
  91. data/lib/mongomodel/support/types/integer.rb +13 -10
  92. data/lib/mongomodel/support/types/object.rb +5 -5
  93. data/lib/mongomodel/support/types/rational.rb +3 -3
  94. data/lib/mongomodel/support/types/time.rb +2 -2
  95. data/lib/mongomodel/version.rb +1 -1
  96. data/lib/rails/generators/mongo_model/config/templates/mongomodel.yml +3 -4
  97. data/lib/rails/generators/mongo_model/model/model_generator.rb +3 -3
  98. data/mongomodel.gemspec +5 -4
  99. data/spec/mongomodel/attributes/store_spec.rb +21 -21
  100. data/spec/mongomodel/concerns/activemodel_spec.rb +4 -4
  101. data/spec/mongomodel/concerns/associations/base/association_spec.rb +12 -12
  102. data/spec/mongomodel/concerns/associations/belongs_to_spec.rb +34 -21
  103. data/spec/mongomodel/concerns/associations/has_many_by_foreign_key_spec.rb +53 -53
  104. data/spec/mongomodel/concerns/associations/has_many_by_ids_spec.rb +30 -30
  105. data/spec/mongomodel/concerns/attribute_methods/before_type_cast_spec.rb +7 -7
  106. data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +45 -41
  107. data/spec/mongomodel/concerns/attribute_methods/multi_parameter_assignment_spec.rb +7 -7
  108. data/spec/mongomodel/concerns/attribute_methods/nested_spec.rb +31 -31
  109. data/spec/mongomodel/concerns/attribute_methods/protected_spec.rb +15 -15
  110. data/spec/mongomodel/concerns/attribute_methods/query_spec.rb +19 -19
  111. data/spec/mongomodel/concerns/attribute_methods/read_spec.rb +9 -9
  112. data/spec/mongomodel/concerns/attribute_methods/write_spec.rb +6 -6
  113. data/spec/mongomodel/concerns/attribute_methods_spec.rb +13 -13
  114. data/spec/mongomodel/concerns/attributes_spec.rb +34 -34
  115. data/spec/mongomodel/concerns/callbacks_spec.rb +25 -21
  116. data/spec/mongomodel/concerns/logging_spec.rb +5 -3
  117. data/spec/mongomodel/concerns/map_reduce_spec.rb +19 -19
  118. data/spec/mongomodel/concerns/observing_spec.rb +3 -3
  119. data/spec/mongomodel/concerns/pretty_inspect_spec.rb +10 -10
  120. data/spec/mongomodel/concerns/properties_spec.rb +11 -11
  121. data/spec/mongomodel/concerns/serialization/json_serialization_spec.rb +13 -13
  122. data/spec/mongomodel/concerns/timestamps_spec.rb +39 -39
  123. data/spec/mongomodel/concerns/validations_spec.rb +41 -38
  124. data/spec/mongomodel/document/callbacks_spec.rb +20 -16
  125. data/spec/mongomodel/document/collection_modifiers_spec.rb +16 -16
  126. data/spec/mongomodel/document/dynamic_finders_spec.rb +46 -46
  127. data/spec/mongomodel/document/finders_spec.rb +15 -15
  128. data/spec/mongomodel/document/indexes_spec.rb +29 -29
  129. data/spec/mongomodel/document/optimistic_locking_spec.rb +16 -16
  130. data/spec/mongomodel/document/persistence_spec.rb +39 -39
  131. data/spec/mongomodel/document/scopes_spec.rb +17 -17
  132. data/spec/mongomodel/document/validations/uniqueness_spec.rb +46 -46
  133. data/spec/mongomodel/document/validations_spec.rb +35 -35
  134. data/spec/mongomodel/document_spec.rb +19 -19
  135. data/spec/mongomodel/embedded_document_spec.rb +19 -19
  136. data/spec/mongomodel/mongomodel_spec.rb +7 -6
  137. data/spec/mongomodel/support/collection_spec.rb +54 -54
  138. data/spec/mongomodel/support/configuration_spec.rb +1 -1
  139. data/spec/mongomodel/support/map_spec.rb +66 -66
  140. data/spec/mongomodel/support/mongo_operator_spec.rb +5 -5
  141. data/spec/mongomodel/support/mongo_options_spec.rb +42 -42
  142. data/spec/mongomodel/support/mongo_order_spec.rb +24 -24
  143. data/spec/mongomodel/support/paginator_spec.rb +15 -15
  144. data/spec/mongomodel/support/property_spec.rb +29 -23
  145. data/spec/mongomodel/support/scope_spec.rb +205 -204
  146. data/spec/spec_helper.rb +13 -2
  147. data/spec/support/callbacks.rb +3 -8
  148. data/spec/support/helpers/define_class.rb +7 -7
  149. data/spec/support/helpers/document_finder_stubs.rb +6 -6
  150. data/spec/support/helpers/specs_for.rb +1 -1
  151. data/spec/support/helpers/validations.rb +1 -1
  152. data/spec/support/matchers/find_with.rb +8 -8
  153. data/spec/support/matchers/respond_to_boolean.rb +3 -3
  154. data/spec/support/matchers/run_callbacks.rb +6 -9
  155. data/spec/support/models.rb +5 -5
  156. metadata +23 -7
@@ -1,27 +1,27 @@
1
1
  module MongoModel
2
2
  class MongoOperator
3
3
  attr_reader :field, :operator
4
-
4
+
5
5
  def initialize(field, operator)
6
6
  @field, @operator = field, operator
7
7
  end
8
-
8
+
9
9
  def to_mongo_selector(value)
10
10
  { "$#{operator}" => value }
11
11
  end
12
-
12
+
13
13
  def inspect
14
14
  "#{field.inspect}.#{operator}"
15
15
  end
16
-
16
+
17
17
  def ==(other)
18
18
  other.is_a?(self.class) && field == other.field && operator == other.operator
19
19
  end
20
-
20
+
21
21
  def hash
22
22
  field.hash ^ operator.hash
23
23
  end
24
-
24
+
25
25
  def eql?(other)
26
26
  self == other
27
27
  end
@@ -3,33 +3,33 @@ require 'active_support/core_ext/class/subclasses'
3
3
  module MongoModel
4
4
  class MongoOptions
5
5
  ValidKeys = [ :conditions, :select, :offset, :limit, :order ]
6
-
6
+
7
7
  attr_reader :selector, :options
8
-
8
+
9
9
  def initialize(model, options={})
10
10
  options.assert_valid_keys(ValidKeys)
11
-
11
+
12
12
  @model = model
13
-
13
+
14
14
  @selector = extract_conditions(options)
15
15
  @options = extract_options(options)
16
-
16
+
17
17
  add_type_to_selector
18
18
  end
19
-
19
+
20
20
  def to_a
21
21
  [selector, options]
22
22
  end
23
-
23
+
24
24
  private
25
25
  def extract_conditions(options)
26
26
  result = {}
27
-
27
+
28
28
  (options[:conditions] || {}).each do |k, v|
29
29
  k = k.to_mongo_operator if k.respond_to?(:to_mongo_operator)
30
-
30
+
31
31
  key = k.respond_to?(:field) ? k.field : k
32
-
32
+
33
33
  if @model.respond_to?(:properties) && property = @model.properties[key]
34
34
  key = property.as
35
35
  value = v.is_a?(Array) ? v.map { |i| property.to_query(i) } : property.to_query(v);
@@ -39,7 +39,7 @@ module MongoModel
39
39
 
40
40
  if k.respond_to?(:to_mongo_selector)
41
41
  selector = k.to_mongo_selector(value)
42
-
42
+
43
43
  if result[key].is_a?(Hash)
44
44
  result[key].merge!(selector)
45
45
  else
@@ -49,33 +49,33 @@ module MongoModel
49
49
  result[key] = value
50
50
  end
51
51
  end
52
-
52
+
53
53
  result
54
54
  end
55
-
55
+
56
56
  def extract_options(options)
57
57
  result = {}
58
-
58
+
59
59
  result[:fields] = convert_select(options[:select]) if options[:select]
60
60
  result[:skip] = options[:offset] if options[:offset]
61
61
  result[:limit] = options[:limit] if options[:limit]
62
62
  result[:sort] = MongoOrder.parse(options[:order]).to_sort(@model) if options[:order]
63
-
63
+
64
64
  result
65
65
  end
66
-
66
+
67
67
  def convert_select(fields)
68
68
  fields.map do |key|
69
69
  (@model.properties[key.to_sym].try(:as) || key).to_sym
70
70
  end
71
71
  end
72
-
72
+
73
73
  def add_type_to_selector
74
74
  if use_type_selector?
75
75
  selector['_type'] = { '$in' => @model.type_selector }
76
76
  end
77
77
  end
78
-
78
+
79
79
  def use_type_selector?
80
80
  @model.respond_to?(:use_type_selector?) && @model.use_type_selector? && selector['_type'].nil?
81
81
  end
@@ -1,36 +1,36 @@
1
1
  module MongoModel
2
2
  class MongoOrder
3
3
  attr_reader :clauses
4
-
4
+
5
5
  def initialize(*clauses)
6
6
  @clauses = clauses
7
7
  end
8
-
8
+
9
9
  def to_a
10
10
  clauses
11
11
  end
12
-
12
+
13
13
  def to_s
14
14
  clauses.map { |c| c.to_s }.join(', ')
15
15
  end
16
-
16
+
17
17
  def to_sort(model)
18
18
  clauses.map { |c| c.to_sort(model.respond_to?(:properties) ? model.properties[c.field] : nil) }
19
19
  end
20
-
20
+
21
21
  def ==(other)
22
22
  other.is_a?(self.class) && clauses == other.clauses
23
23
  end
24
24
  alias eql? ==
25
-
25
+
26
26
  def hash
27
27
  clauses.hash
28
28
  end
29
-
29
+
30
30
  def reverse
31
31
  self.class.new(*clauses.map { |c| c.reverse })
32
32
  end
33
-
33
+
34
34
  def self.parse(order)
35
35
  case order
36
36
  when MongoOrder
@@ -47,35 +47,35 @@ module MongoModel
47
47
  new(order.to_mongo_order_clause) if order.respond_to?(:to_mongo_order_clause)
48
48
  end
49
49
  end
50
-
50
+
51
51
  class Clause
52
52
  attr_reader :field, :order
53
-
53
+
54
54
  def initialize(field, order=:ascending)
55
55
  @field, @order = field.to_sym, order.to_sym
56
56
  end
57
-
57
+
58
58
  def to_s
59
59
  "#{field} #{order}"
60
60
  end
61
-
61
+
62
62
  def to_sort(property)
63
63
  [property ? property.as : field.to_s, order]
64
64
  end
65
-
65
+
66
66
  def reverse
67
67
  self.class.new(field, order == :ascending ? :descending : :ascending)
68
68
  end
69
-
69
+
70
70
  def ==(other)
71
71
  other.is_a?(self.class) && field == other.field && order == other.order
72
72
  end
73
73
  alias eql? ==
74
-
74
+
75
75
  def hash
76
76
  [field, order].hash
77
77
  end
78
-
78
+
79
79
  def self.parse(clause)
80
80
  case clause
81
81
  when Clause
@@ -1,13 +1,13 @@
1
1
  module MongoModel
2
2
  class Paginator < Array
3
3
  attr_reader :current_page, :per_page, :total_entries
4
-
4
+
5
5
  def initialize(scope, page, per_page)
6
6
  @current_page = page.to_i
7
7
  @per_page = per_page.to_i
8
-
8
+
9
9
  super(scope.offset(offset).limit(per_page))
10
-
10
+
11
11
  # Try to autodetect total entries
12
12
  if total_entries.nil? && size < per_page && (current_page == 1 or size > 0)
13
13
  @total_entries = offset + size
@@ -15,23 +15,23 @@ module MongoModel
15
15
  @total_entries = scope.count
16
16
  end
17
17
  end
18
-
18
+
19
19
  def total_pages
20
20
  total_entries.zero? ? 1 : (total_entries / per_page.to_f).ceil
21
21
  end
22
-
22
+
23
23
  def previous_page
24
24
  current_page > 1 ? (current_page - 1) : nil
25
25
  end
26
-
26
+
27
27
  def next_page
28
28
  current_page < total_pages ? (current_page + 1) : nil
29
29
  end
30
-
30
+
31
31
  def out_of_bounds?
32
32
  current_page > total_pages
33
33
  end
34
-
34
+
35
35
  def offset
36
36
  (current_page - 1) * per_page
37
37
  end
@@ -1,29 +1,29 @@
1
1
  module MongoModel
2
2
  class Reference
3
3
  attr_reader :id
4
-
4
+
5
5
  def initialize(id)
6
6
  @id = id
7
7
  end
8
-
8
+
9
9
  def to_s
10
10
  id.to_s
11
11
  end
12
-
12
+
13
13
  alias :to_str :to_s
14
-
14
+
15
15
  def hash
16
16
  id.hash
17
17
  end
18
-
18
+
19
19
  def as_json(*)
20
20
  to_s
21
21
  end
22
-
22
+
23
23
  def blank?
24
24
  id.blank?
25
25
  end
26
-
26
+
27
27
  def eql?(other)
28
28
  case other
29
29
  when Reference
@@ -33,11 +33,11 @@ module MongoModel
33
33
  end
34
34
  end
35
35
  alias_method :==, :eql?
36
-
36
+
37
37
  def to_mongo
38
38
  id.blank? ? nil : id
39
39
  end
40
-
40
+
41
41
  def self.cast(value)
42
42
  case value
43
43
  when BSON::ObjectId
@@ -50,7 +50,7 @@ module MongoModel
50
50
  end
51
51
  end
52
52
  end
53
-
53
+
54
54
  def self.from_mongo(value)
55
55
  cast(value)
56
56
  end
@@ -4,7 +4,7 @@ module MongoModel
4
4
  class Scope
5
5
  MULTI_VALUE_METHODS = [ :select, :order, :where ]
6
6
  SINGLE_VALUE_METHODS = [ :limit, :offset, :from ]
7
-
7
+
8
8
  autoload :ArrayMethods, 'mongomodel/support/scope/array_methods'
9
9
  autoload :SpawnMethods, 'mongomodel/support/scope/spawn_methods'
10
10
  autoload :QueryMethods, 'mongomodel/support/scope/query_methods'
@@ -13,72 +13,72 @@ module MongoModel
13
13
  autoload :DynamicFinders, 'mongomodel/support/scope/dynamic_finders'
14
14
  autoload :Pagination, 'mongomodel/support/scope/pagination'
15
15
  autoload :Batches, 'mongomodel/support/scope/batches'
16
-
16
+
17
17
  include Batches, Pagination, DynamicFinders, LoadMethods, FinderMethods, ArrayMethods, QueryMethods, SpawnMethods
18
-
18
+
19
19
  delegate :inspect, :as_json, :to => :to_a
20
-
20
+
21
21
  attr_reader :klass
22
-
22
+
23
23
  def initialize(klass)
24
24
  super
25
-
25
+
26
26
  @klass = klass
27
-
27
+
28
28
  @loaded = false
29
29
  @documents = []
30
30
  end
31
-
31
+
32
32
  def initialize_copy(other)
33
33
  reset
34
34
  end
35
-
35
+
36
36
  def build(*args, &block)
37
37
  new(*args, &block)
38
38
  end
39
-
39
+
40
40
  def to_a
41
41
  return @documents if loaded?
42
-
42
+
43
43
  @documents = _find_and_instantiate
44
44
  @loaded = true
45
-
45
+
46
46
  @documents
47
47
  end
48
-
48
+
49
49
  def size
50
50
  loaded? ? @documents.size : count
51
51
  end
52
-
52
+
53
53
  def empty?
54
54
  loaded? ? @documents.empty? : count.zero?
55
55
  end
56
-
56
+
57
57
  def count
58
58
  _find.count
59
59
  end
60
-
60
+
61
61
  def destroy_all
62
62
  to_a.each { |doc| doc.destroy }
63
63
  reset
64
64
  end
65
-
65
+
66
66
  def destroy(*ids)
67
67
  where(ids_to_conditions(ids)).destroy_all
68
68
  reset
69
69
  end
70
-
70
+
71
71
  def delete_all
72
72
  selector = MongoOptions.new(klass, :conditions => finder_conditions).selector
73
73
  collection.remove(selector, {})
74
74
  reset
75
75
  end
76
-
76
+
77
77
  def delete(*ids)
78
78
  where(ids_to_conditions(ids)).delete_all
79
79
  reset
80
80
  end
81
-
81
+
82
82
  def update_all(updates)
83
83
  if updates.any?
84
84
  selector = MongoOptions.new(klass, :conditions => finder_conditions).selector
@@ -88,22 +88,22 @@ module MongoModel
88
88
  self
89
89
  end
90
90
  end
91
-
91
+
92
92
  def update(ids, updates)
93
93
  where(ids_to_conditions(ids)).update_all(updates)
94
94
  reset
95
95
  end
96
-
96
+
97
97
  def loaded?
98
98
  @loaded
99
99
  end
100
-
100
+
101
101
  def reload
102
102
  reset
103
103
  to_a
104
104
  self
105
105
  end
106
-
106
+
107
107
  def reset
108
108
  @loaded = nil
109
109
  @documents = []
@@ -111,7 +111,7 @@ module MongoModel
111
111
  @options_for_create = nil
112
112
  self
113
113
  end
114
-
114
+
115
115
  def ==(other)
116
116
  case other
117
117
  when Scope
@@ -122,11 +122,11 @@ module MongoModel
122
122
  to_a == other.to_a
123
123
  end
124
124
  end
125
-
125
+
126
126
  def collection
127
127
  from_value || klass.collection
128
128
  end
129
-
129
+
130
130
  def finder_options
131
131
  @finder_options ||= {}.tap do |result|
132
132
  result[:conditions] = finder_conditions if where_values.any?
@@ -136,15 +136,15 @@ module MongoModel
136
136
  result[:offset] = offset_value if offset_value.present?
137
137
  end
138
138
  end
139
-
139
+
140
140
  def options_for_create
141
141
  @options_for_create ||= finder_conditions.reject { |k, v| k.is_a?(MongoModel::MongoOperator) || k.respond_to?(:to_mongo_operator) }
142
142
  end
143
-
143
+
144
144
  def respond_to?(method, include_private = false)
145
145
  Array.method_defined?(method) || klass.respond_to?(method, include_private) || super
146
146
  end
147
-
147
+
148
148
  protected
149
149
  def method_missing(method, *args, &block)
150
150
  if Array.method_defined?(method)
@@ -157,14 +157,14 @@ module MongoModel
157
157
  super
158
158
  end
159
159
  end
160
-
160
+
161
161
  private
162
162
  def _find
163
163
  ensure_indexes!
164
164
  selector, options = MongoOptions.new(klass, finder_options).to_a
165
165
  collection.find(selector, options)
166
166
  end
167
-
167
+
168
168
  def _find_and_instantiate
169
169
  _find.to_a.map { |doc|
170
170
  klass.from_mongo(doc).tap { |instance|
@@ -172,25 +172,25 @@ module MongoModel
172
172
  }
173
173
  }
174
174
  end
175
-
175
+
176
176
  def finder_conditions
177
177
  where_values.inject({}) { |conditions, v| conditions.merge(v) }
178
178
  end
179
-
179
+
180
180
  def with_scope(&block)
181
181
  klass.send(:with_scope, self, &block)
182
182
  end
183
-
183
+
184
184
  def ids_to_conditions(ids)
185
185
  ids = Array.wrap(ids).flatten
186
-
186
+
187
187
  if ids.size == 1
188
188
  { :id => ids.first.to_s }
189
189
  else
190
190
  { :id.in => ids.map { |id| id.to_s } }
191
191
  end
192
192
  end
193
-
193
+
194
194
  def ensure_indexes!
195
195
  if klass.respond_to?(:indexes_initialized?) && !klass.indexes_initialized?
196
196
  klass.ensure_indexes!