mongoid-locomotive 2.0.0.beta9
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/MIT_LICENSE +20 -0
- data/README.rdoc +47 -0
- data/lib/mongoid.rb +141 -0
- data/lib/mongoid/associations.rb +306 -0
- data/lib/mongoid/associations/embedded_in.rb +74 -0
- data/lib/mongoid/associations/embeds_many.rb +280 -0
- data/lib/mongoid/associations/embeds_one.rb +97 -0
- data/lib/mongoid/associations/foreign_key.rb +35 -0
- data/lib/mongoid/associations/meta_data.rb +38 -0
- data/lib/mongoid/associations/options.rb +62 -0
- data/lib/mongoid/associations/proxy.rb +33 -0
- data/lib/mongoid/associations/referenced_in.rb +59 -0
- data/lib/mongoid/associations/references_many.rb +245 -0
- data/lib/mongoid/associations/references_many_as_array.rb +78 -0
- data/lib/mongoid/associations/references_one.rb +99 -0
- data/lib/mongoid/atomicity.rb +55 -0
- data/lib/mongoid/attributes.rb +242 -0
- data/lib/mongoid/callbacks.rb +21 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections.rb +71 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +29 -0
- data/lib/mongoid/collections/operations.rb +41 -0
- data/lib/mongoid/collections/slaves.rb +45 -0
- data/lib/mongoid/components.rb +34 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/contexts.rb +24 -0
- data/lib/mongoid/contexts/enumerable.rb +156 -0
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +285 -0
- data/lib/mongoid/contexts/paging.rb +50 -0
- data/lib/mongoid/criteria.rb +248 -0
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +65 -0
- data/lib/mongoid/criterion/inclusion.rb +110 -0
- data/lib/mongoid/criterion/optional.rb +189 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +21 -0
- data/lib/mongoid/dirty.rb +252 -0
- data/lib/mongoid/document.rb +210 -0
- data/lib/mongoid/errors.rb +131 -0
- data/lib/mongoid/extensions.rb +115 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -0
- data/lib/mongoid/extensions/array/conversions.rb +23 -0
- data/lib/mongoid/extensions/array/parentization.rb +13 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
- data/lib/mongoid/extensions/date/conversions.rb +24 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/false_class/equality.rb +13 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/accessors.rb +42 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
- data/lib/mongoid/extensions/hash/conversions.rb +42 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
- data/lib/mongoid/extensions/object/conversions.rb +21 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/set/conversions.rb +20 -0
- data/lib/mongoid/extensions/string/conversions.rb +15 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extensions/true_class/equality.rb +13 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +83 -0
- data/lib/mongoid/fields.rb +62 -0
- data/lib/mongoid/finders.rb +145 -0
- data/lib/mongoid/hierarchy.rb +74 -0
- data/lib/mongoid/identity.rb +47 -0
- data/lib/mongoid/indexes.rb +27 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/logger.rb +19 -0
- data/lib/mongoid/matchers.rb +35 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +26 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/paranoia.rb +106 -0
- data/lib/mongoid/paths.rb +61 -0
- data/lib/mongoid/persistence.rb +216 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +48 -0
- data/lib/mongoid/persistence/insert_embedded.rb +44 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +38 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +71 -0
- data/lib/mongoid/railtie.rb +67 -0
- data/lib/mongoid/railties/database.rake +60 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +32 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +5 -0
- data/lib/mongoid/validations/uniqueness.rb +56 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +26 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
- data/spec/integration/mongoid/associations_spec.rb +768 -0
- data/spec/integration/mongoid/attributes_spec.rb +59 -0
- data/spec/integration/mongoid/callback_spec.rb +33 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +281 -0
- data/spec/integration/mongoid/dirty_spec.rb +85 -0
- data/spec/integration/mongoid/document_spec.rb +741 -0
- data/spec/integration/mongoid/extensions_spec.rb +22 -0
- data/spec/integration/mongoid/finders_spec.rb +119 -0
- data/spec/integration/mongoid/inheritance_spec.rb +171 -0
- data/spec/integration/mongoid/named_scope_spec.rb +58 -0
- data/spec/integration/mongoid/paranoia_spec.rb +44 -0
- data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
- data/spec/integration/mongoid/persistence_spec.rb +311 -0
- data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
- data/spec/models/account.rb +5 -0
- data/spec/models/address.rb +40 -0
- data/spec/models/agent.rb +7 -0
- data/spec/models/animal.rb +15 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/callbacks.rb +47 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/comment.rb +10 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/favorite.rb +8 -0
- data/spec/models/game.rb +9 -0
- data/spec/models/inheritance.rb +72 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +106 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +25 -0
- data/spec/models/preference.rb +7 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/survey.rb +6 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/user.rb +6 -0
- data/spec/models/user_accout.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +5 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
- data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
- data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
- data/spec/unit/mongoid/associations/options_spec.rb +215 -0
- data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
- data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
- data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
- data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
- data/spec/unit/mongoid/associations_spec.rb +688 -0
- data/spec/unit/mongoid/atomicity_spec.rb +164 -0
- data/spec/unit/mongoid/attributes_spec.rb +646 -0
- data/spec/unit/mongoid/callbacks_spec.rb +85 -0
- data/spec/unit/mongoid/collection_spec.rb +187 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/collections_spec.rb +98 -0
- data/spec/unit/mongoid/config_spec.rb +298 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +873 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
- data/spec/unit/mongoid/cursor_spec.rb +80 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/dirty_spec.rb +430 -0
- data/spec/unit/mongoid/document_spec.rb +623 -0
- data/spec/unit/mongoid/errors_spec.rb +154 -0
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
- data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
- data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
- data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extras_spec.rb +102 -0
- data/spec/unit/mongoid/factory_spec.rb +31 -0
- data/spec/unit/mongoid/field_spec.rb +169 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +439 -0
- data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +99 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/logger_spec.rb +38 -0
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/memoization_spec.rb +75 -0
- data/spec/unit/mongoid/named_scope_spec.rb +123 -0
- data/spec/unit/mongoid/paranoia_spec.rb +108 -0
- data/spec/unit/mongoid/paths_spec.rb +272 -0
- data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
- data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
- data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
- data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
- data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
- data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
- data/spec/unit/mongoid/persistence_spec.rb +452 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/serialization_spec.rb +43 -0
- data/spec/unit/mongoid/state_spec.rb +94 -0
- data/spec/unit/mongoid/timestamps_spec.rb +30 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
- data/spec/unit/mongoid/validations_spec.rb +43 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +433 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
class Scope #:nodoc:
|
|
4
|
+
|
|
5
|
+
delegate :scopes, :to => :parent
|
|
6
|
+
|
|
7
|
+
attr_reader :parent, :conditions
|
|
8
|
+
|
|
9
|
+
# If the other is a scope then compare the parent and conditions, otherwise
|
|
10
|
+
# if its enumerable collect and compare.
|
|
11
|
+
def ==(other)
|
|
12
|
+
case other
|
|
13
|
+
when Scope
|
|
14
|
+
@parent == other.parent && @conditions == other.conditions
|
|
15
|
+
when Enumerable
|
|
16
|
+
@collection ||= entries
|
|
17
|
+
return (@collection == other)
|
|
18
|
+
else
|
|
19
|
+
return false
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Create the new +Scope+. If a block is passed in, this Scope will extend
|
|
24
|
+
# the block.
|
|
25
|
+
#
|
|
26
|
+
# Options:
|
|
27
|
+
#
|
|
28
|
+
# parent: The class the scope belongs to, or a parent +Scope+.
|
|
29
|
+
# conditions: A +Hash+ of conditions.
|
|
30
|
+
#
|
|
31
|
+
# Example:
|
|
32
|
+
#
|
|
33
|
+
# Mongoid::Scope.new(Person, { :title => "Sir" }) do
|
|
34
|
+
# def knighted?
|
|
35
|
+
# title == "Sir"
|
|
36
|
+
# end
|
|
37
|
+
# end
|
|
38
|
+
def initialize(parent, conditions, &block)
|
|
39
|
+
@parent, @conditions = parent, conditions
|
|
40
|
+
extend Module.new(&block) if block_given?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Return the class for the +Scope+. This will be the parent if the parent
|
|
44
|
+
# is a class, otherwise will be nil.
|
|
45
|
+
def klass
|
|
46
|
+
@klass ||= @parent unless @parent.is_a?(Scope)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Chaining is supported through method_missing. If a scope is already
|
|
50
|
+
# defined with the method name the call will be passed there, otherwise it
|
|
51
|
+
# will be passed to the target or parent.
|
|
52
|
+
def method_missing(name, *args, &block)
|
|
53
|
+
if scopes.include?(name)
|
|
54
|
+
scopes[name].call(self, *args)
|
|
55
|
+
elsif klass
|
|
56
|
+
target.send(name, *args, &block)
|
|
57
|
+
else
|
|
58
|
+
@parent.fuse(@conditions); @parent.send(name, *args, &block)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The +Scope+ must respond like a +Criteria+ object. If this is a parent
|
|
63
|
+
# criteria delegate to the target, otherwise bubble up to the parent.
|
|
64
|
+
def respond_to?(name)
|
|
65
|
+
super || (klass ? target.respond_to?(name) : @parent.respond_to?(name))
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Returns the target criteria if it has already been set or creates a new
|
|
69
|
+
# criteria from the parent class.
|
|
70
|
+
def target
|
|
71
|
+
@target ||= klass.criteria.fuse(@conditions)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module State #:nodoc:
|
|
4
|
+
# Returns true if the +Document+ has not been persisted to the database,
|
|
5
|
+
# false if it has. This is determined by the variable @new_record
|
|
6
|
+
# and NOT if the object has an id.
|
|
7
|
+
def new_record?
|
|
8
|
+
@new_record == true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Sets the new_record boolean - used after document is saved.
|
|
12
|
+
def new_record=(saved)
|
|
13
|
+
@new_record = saved
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Checks if the document has been saved to the database.
|
|
17
|
+
def persisted?
|
|
18
|
+
!new_record?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Returns true if the +Document+ has been succesfully destroyed, and false if it hasn't.
|
|
22
|
+
# This is determined by the variable @destroyed and NOT by checking the database.
|
|
23
|
+
def destroyed?
|
|
24
|
+
@destroyed == true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Sets the destroyed boolean - used after document is destroyed.
|
|
28
|
+
def destroyed=(destroyed)
|
|
29
|
+
@destroyed = destroyed && true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Timestamps
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
field :created_at, :type => Time
|
|
7
|
+
field :updated_at, :type => Time
|
|
8
|
+
set_callback :create, :before, :set_created_at
|
|
9
|
+
set_callback :save, :before, :set_updated_at
|
|
10
|
+
|
|
11
|
+
class_inheritable_accessor :record_timestamps, :instance_writer => false
|
|
12
|
+
self.record_timestamps = true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Update the created_at field on the Document to the current time. This is
|
|
16
|
+
# only called on create.
|
|
17
|
+
def set_created_at
|
|
18
|
+
self.created_at = Time.now.utc if !created_at
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Update the updated_at field on the Document to the current time.
|
|
22
|
+
# This is only called on create and on save.
|
|
23
|
+
def set_updated_at
|
|
24
|
+
self.updated_at = Time.now.utc
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "mongoid/validations/associated"
|
|
3
|
+
require "mongoid/validations/uniqueness"
|
|
4
|
+
|
|
5
|
+
I18n.load_path << File.join(
|
|
6
|
+
File.dirname(__FILE__), "validations", "locale", "en.yml"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
module Mongoid #:nodoc:
|
|
10
|
+
# This module provides additional validations that ActiveModel does not
|
|
11
|
+
# provide: validates_associated and validates_uniqueness_of
|
|
12
|
+
module Validations
|
|
13
|
+
extend ActiveSupport::Concern
|
|
14
|
+
included do
|
|
15
|
+
include ActiveModel::Validations
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module ClassMethods #:nodoc:
|
|
19
|
+
# Validates whether or not an association is valid or not. Will correctly
|
|
20
|
+
# handle has one and has many associations.
|
|
21
|
+
#
|
|
22
|
+
# Example:
|
|
23
|
+
#
|
|
24
|
+
# class Person
|
|
25
|
+
# include Mongoid::Document
|
|
26
|
+
# embeds_one :name
|
|
27
|
+
# embeds_many :addresses
|
|
28
|
+
#
|
|
29
|
+
# validates_associated :name, :addresses
|
|
30
|
+
# end
|
|
31
|
+
def validates_associated(*args)
|
|
32
|
+
validates_with(AssociatedValidator, _merge_attributes(args))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Validates whether or not a field is unique against the documents in the
|
|
36
|
+
# database.
|
|
37
|
+
#
|
|
38
|
+
# Example:
|
|
39
|
+
#
|
|
40
|
+
# class Person
|
|
41
|
+
# include Mongoid::Document
|
|
42
|
+
# field :title
|
|
43
|
+
#
|
|
44
|
+
# validates_uniqueness_of :title
|
|
45
|
+
# end
|
|
46
|
+
def validates_uniqueness_of(*args)
|
|
47
|
+
validates_with(UniquenessValidator, _merge_attributes(args))
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Validations #:nodoc:
|
|
4
|
+
# Validates whether or not an association is valid or not. Will correctly
|
|
5
|
+
# handle has one and has many associations.
|
|
6
|
+
#
|
|
7
|
+
# Example:
|
|
8
|
+
#
|
|
9
|
+
# class Person
|
|
10
|
+
# include Mongoid::Document
|
|
11
|
+
# embeds_one :name
|
|
12
|
+
# embeds_many :addresses
|
|
13
|
+
#
|
|
14
|
+
# validates_associated :name, :addresses
|
|
15
|
+
# end
|
|
16
|
+
class AssociatedValidator < ActiveModel::EachValidator
|
|
17
|
+
|
|
18
|
+
# Validates that the associations provided are either all nil or all
|
|
19
|
+
# valid. If neither is true then the appropriate errors will be added to
|
|
20
|
+
# the parent document.
|
|
21
|
+
#
|
|
22
|
+
# Example:
|
|
23
|
+
#
|
|
24
|
+
# <tt>validator.validate_each(document, :name, name)</tt>
|
|
25
|
+
def validate_each(document, attribute, value)
|
|
26
|
+
values = value.is_a?(Array) ? value : [ value ]
|
|
27
|
+
return if values.collect { |doc| doc.nil? || doc.valid? }.all?
|
|
28
|
+
document.errors.add(attribute, :invalid, options.merge!(:value => value))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Validations #:nodoc:
|
|
4
|
+
# Validates whether or not a field is unique against the documents in the
|
|
5
|
+
# database.
|
|
6
|
+
#
|
|
7
|
+
# Example:
|
|
8
|
+
#
|
|
9
|
+
# class Person
|
|
10
|
+
# include Mongoid::Document
|
|
11
|
+
# field :title
|
|
12
|
+
#
|
|
13
|
+
# validates_uniqueness_of :title
|
|
14
|
+
# end
|
|
15
|
+
class UniquenessValidator < ActiveModel::EachValidator
|
|
16
|
+
# Unfortunately, we have to tie Uniqueness validators to a class.
|
|
17
|
+
def setup(klass)
|
|
18
|
+
@klass = klass
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def validate_each(document, attribute, value)
|
|
22
|
+
if document.embedded?
|
|
23
|
+
return if document._parent.nil?
|
|
24
|
+
|
|
25
|
+
criteria = document._parent.send(document.association_name)
|
|
26
|
+
|
|
27
|
+
# If the parent document embeds_one, no need to validate uniqueness
|
|
28
|
+
return if criteria.is_a?(Mongoid::Document)
|
|
29
|
+
|
|
30
|
+
criteria = criteria.where(attribute => value, :_id => {'$ne' => document._id})
|
|
31
|
+
else
|
|
32
|
+
criteria = @klass.where(attribute => value)
|
|
33
|
+
|
|
34
|
+
unless document.new_record?
|
|
35
|
+
criteria = criteria.where(:_id => {'$ne' => document._id})
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
Array.wrap(options[:scope]).each do |item|
|
|
40
|
+
criteria = criteria.where(item => document.attributes[item])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if criteria.exists?
|
|
44
|
+
document.errors.add(attribute, :taken, :default => options[:message], :value => value)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
protected
|
|
49
|
+
def key_changed?(document)
|
|
50
|
+
(document.primary_key || {}).each do |key|
|
|
51
|
+
return true if document.send("#{key}_changed?")
|
|
52
|
+
end; false
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
# Include this module to get automatic versioning of root level documents.
|
|
4
|
+
# This will add a version field to the +Document+ and a has_many association
|
|
5
|
+
# with all the versions contained in it.
|
|
6
|
+
module Versioning
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
included do
|
|
9
|
+
field :version, :type => Integer, :default => 1
|
|
10
|
+
embeds_many :versions, :class_name => self.name
|
|
11
|
+
set_callback :save, :before, :revise
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Create a new version of the +Document+. This will load the previous
|
|
15
|
+
# document from the database and set it as the next version before saving
|
|
16
|
+
# the current document. It then increments the version number.
|
|
17
|
+
def revise
|
|
18
|
+
last_version = self.class.first(:conditions => { :_id => id, :version => version })
|
|
19
|
+
if last_version
|
|
20
|
+
self.versions << last_version.clone
|
|
21
|
+
self.version = version + 1
|
|
22
|
+
@modifications["versions"] = [ nil, @attributes["versions"] ] if @modifications
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'rails/generators/mongoid_generator'
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Generators
|
|
6
|
+
class ConfigGenerator < Rails::Generators::Base
|
|
7
|
+
desc "Creates a Mongoid configuration file at config/mongoid.yml"
|
|
8
|
+
|
|
9
|
+
argument :database_name, :type => :string, :optional => true
|
|
10
|
+
|
|
11
|
+
def self.source_root
|
|
12
|
+
@_mongoid_source_root ||= File.expand_path("../templates", __FILE__)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def app_name
|
|
16
|
+
Rails::Application.subclasses.first.parent.to_s.underscore
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def create_config_file
|
|
20
|
+
template 'mongoid.yml', File.join('config', "mongoid.yml")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
defaults: &defaults
|
|
2
|
+
host: localhost
|
|
3
|
+
# slaves:
|
|
4
|
+
# - host: slave1.local
|
|
5
|
+
# port: 27018
|
|
6
|
+
# - host: slave2.local
|
|
7
|
+
# port: 27019
|
|
8
|
+
|
|
9
|
+
development:
|
|
10
|
+
<<: *defaults
|
|
11
|
+
database: <%= database_name || app_name %>_development
|
|
12
|
+
|
|
13
|
+
test:
|
|
14
|
+
<<: *defaults
|
|
15
|
+
database: <%= database_name || app_name %>_test
|
|
16
|
+
|
|
17
|
+
# set these environment variables on your prod server
|
|
18
|
+
production:
|
|
19
|
+
<<: *defaults
|
|
20
|
+
host: <%%= ENV['MONGOID_HOST'] %>
|
|
21
|
+
port: <%%= ENV['MONGOID_PORT'] %>
|
|
22
|
+
username: <%%= ENV['MONGOID_USERNAME'] %>
|
|
23
|
+
password: <%%= ENV['MONGOID_PASSWORD'] %>
|
|
24
|
+
database: <%%= ENV['MONGOID_DATABASE'] %>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "rails/generators/mongoid_generator"
|
|
3
|
+
|
|
4
|
+
module Mongoid #:nodoc:
|
|
5
|
+
module Generators #:nodoc:
|
|
6
|
+
class ModelGenerator < Base #:nodoc:
|
|
7
|
+
|
|
8
|
+
desc "Creates a Mongoid model"
|
|
9
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
|
10
|
+
|
|
11
|
+
check_class_collision
|
|
12
|
+
|
|
13
|
+
class_option :timestamps, :type => :boolean
|
|
14
|
+
class_option :parent, :type => :string, :desc => "The parent class for the generated model"
|
|
15
|
+
class_option :versioning, :type => :boolean, :default => false, :desc => "Enable mongoid versioning"
|
|
16
|
+
|
|
17
|
+
def create_model_file
|
|
18
|
+
template "model.rb", File.join("app/models", class_path, "#{file_name}.rb")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
hook_for :test_framework
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class <%= class_name %><%= " < #{options[:parent].classify}" if options[:parent] %>
|
|
2
|
+
<% unless options[:parent] -%>
|
|
3
|
+
include Mongoid::Document
|
|
4
|
+
<% end -%>
|
|
5
|
+
<% if options[:timestamps] -%>
|
|
6
|
+
include Mongoid::Timestamps
|
|
7
|
+
<% end -%>
|
|
8
|
+
<%= 'include Mongoid::Versioning' if options[:versioning] -%>
|
|
9
|
+
<% attributes.reject{|attr| attr.reference?}.each do |attribute| -%>
|
|
10
|
+
field :<%= attribute.name %>, :type => <%= attribute.type_class %>
|
|
11
|
+
<% end -%>
|
|
12
|
+
<% attributes.select{|attr| attr.reference? }.each do |attribute| -%>
|
|
13
|
+
embedded_in :<%= attribute.name%>, :inverse_of => :<%= class_name.tableize %>
|
|
14
|
+
<% end -%>
|
|
15
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "rails/generators/named_base"
|
|
3
|
+
require "rails/generators/active_model"
|
|
4
|
+
|
|
5
|
+
module Mongoid #:nodoc:
|
|
6
|
+
module Generators #:nodoc:
|
|
7
|
+
class Base < ::Rails::Generators::NamedBase #:nodoc:
|
|
8
|
+
|
|
9
|
+
def self.source_root
|
|
10
|
+
@_mongoid_source_root ||=
|
|
11
|
+
File.expand_path("../#{base_name}/#{generator_name}/templates", __FILE__)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class ActiveModel < ::Rails::Generators::ActiveModel #:nodoc:
|
|
16
|
+
def self.all(klass)
|
|
17
|
+
"#{klass}.all"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.find(klass, params=nil)
|
|
21
|
+
"#{klass}.find(#{params})"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.build(klass, params=nil)
|
|
25
|
+
if params
|
|
26
|
+
"#{klass}.new(#{params})"
|
|
27
|
+
else
|
|
28
|
+
"#{klass}.new"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def save
|
|
33
|
+
"#{name}.save"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def update_attributes(params=nil)
|
|
37
|
+
"#{name}.update_attributes(#{params})"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def errors
|
|
41
|
+
"#{name}.errors"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def destroy
|
|
45
|
+
"#{name}.destroy"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
module Rails
|
|
52
|
+
module Generators
|
|
53
|
+
class GeneratedAttribute #:nodoc:
|
|
54
|
+
def type_class
|
|
55
|
+
return "Time" if type.to_s == "datetime"
|
|
56
|
+
return "String" if type.to_s == "text"
|
|
57
|
+
return type.to_s.camelcase
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|