active_mongoid 0.1.0
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.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +22 -0
- data/.ruby_gemset +1 -0
- data/.ruby_version +1 -0
- data/.travis.yml +11 -0
- data/Appraisals +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +198 -0
- data/Rakefile +7 -0
- data/active_mongoid.gemspec +36 -0
- data/gemfiles/mongoid_2.8.gemfile +7 -0
- data/gemfiles/mongoid_2.8.gemfile.lock +105 -0
- data/gemfiles/mongoid_3.1.gemfile +7 -0
- data/gemfiles/mongoid_3.1.gemfile.lock +108 -0
- data/lib/active_mongoid.rb +8 -0
- data/lib/active_mongoid/associations.rb +82 -0
- data/lib/active_mongoid/associations/binding.rb +77 -0
- data/lib/active_mongoid/associations/builder.rb +26 -0
- data/lib/active_mongoid/associations/builders/in.rb +17 -0
- data/lib/active_mongoid/associations/builders/many.rb +15 -0
- data/lib/active_mongoid/associations/builders/one.rb +15 -0
- data/lib/active_mongoid/associations/document_relation/accessors.rb +100 -0
- data/lib/active_mongoid/associations/document_relation/associations.rb +33 -0
- data/lib/active_mongoid/associations/document_relation/auto_save.rb +31 -0
- data/lib/active_mongoid/associations/document_relation/bindings/in.rb +48 -0
- data/lib/active_mongoid/associations/document_relation/bindings/many.rb +19 -0
- data/lib/active_mongoid/associations/document_relation/bindings/one.rb +19 -0
- data/lib/active_mongoid/associations/document_relation/builders.rb +31 -0
- data/lib/active_mongoid/associations/document_relation/dependent.rb +26 -0
- data/lib/active_mongoid/associations/document_relation/macros.rb +51 -0
- data/lib/active_mongoid/associations/document_relation/referenced/in.rb +72 -0
- data/lib/active_mongoid/associations/document_relation/referenced/many.rb +125 -0
- data/lib/active_mongoid/associations/document_relation/referenced/one.rb +75 -0
- data/lib/active_mongoid/associations/many.rb +211 -0
- data/lib/active_mongoid/associations/metadata.rb +229 -0
- data/lib/active_mongoid/associations/one.rb +21 -0
- data/lib/active_mongoid/associations/proxy.rb +38 -0
- data/lib/active_mongoid/associations/record_relation/accessors.rb +80 -0
- data/lib/active_mongoid/associations/record_relation/associations.rb +33 -0
- data/lib/active_mongoid/associations/record_relation/auto_save.rb +43 -0
- data/lib/active_mongoid/associations/record_relation/bindings/in.rb +48 -0
- data/lib/active_mongoid/associations/record_relation/bindings/many.rb +19 -0
- data/lib/active_mongoid/associations/record_relation/bindings/one.rb +19 -0
- data/lib/active_mongoid/associations/record_relation/builders.rb +31 -0
- data/lib/active_mongoid/associations/record_relation/dependent.rb +26 -0
- data/lib/active_mongoid/associations/record_relation/macros.rb +65 -0
- data/lib/active_mongoid/associations/record_relation/referenced/in.rb +72 -0
- data/lib/active_mongoid/associations/record_relation/referenced/many.rb +128 -0
- data/lib/active_mongoid/associations/record_relation/referenced/one.rb +75 -0
- data/lib/active_mongoid/associations/targets/enumerable.rb +161 -0
- data/lib/active_mongoid/bson_id.rb +44 -0
- data/lib/active_mongoid/finder_proxy.rb +55 -0
- data/lib/active_mongoid/finders.rb +60 -0
- data/lib/active_mongoid/version.rb +3 -0
- data/spec/lib/associations/document_relation/accessors_spec.rb +330 -0
- data/spec/lib/associations/document_relation/auto_save_spec.rb +157 -0
- data/spec/lib/associations/document_relation/bindings/in_spec.rb +39 -0
- data/spec/lib/associations/document_relation/bindings/many_spec.rb +36 -0
- data/spec/lib/associations/document_relation/bindings/one_spec.rb +39 -0
- data/spec/lib/associations/document_relation/builders_spec.rb +117 -0
- data/spec/lib/associations/document_relation/dependent_spec.rb +87 -0
- data/spec/lib/associations/document_relation/macros_spec.rb +68 -0
- data/spec/lib/associations/document_relation/referenced/in_spec.rb +27 -0
- data/spec/lib/associations/document_relation/referenced/many_spec.rb +32 -0
- data/spec/lib/associations/document_relation/referenced/one_spec.rb +28 -0
- data/spec/lib/associations/metadata_spec.rb +157 -0
- data/spec/lib/associations/record_relation/accessors_spec.rb +328 -0
- data/spec/lib/associations/record_relation/auto_save_spec.rb +157 -0
- data/spec/lib/associations/record_relation/bindings/in_spec.rb +39 -0
- data/spec/lib/associations/record_relation/bindings/many_spec.rb +39 -0
- data/spec/lib/associations/record_relation/bindings/one_spec.rb +57 -0
- data/spec/lib/associations/record_relation/builders_spec.rb +118 -0
- data/spec/lib/associations/record_relation/dependent_spec.rb +87 -0
- data/spec/lib/associations/record_relation/macros_spec.rb +73 -0
- data/spec/lib/associations/record_relation/referenced/in_spec.rb +27 -0
- data/spec/lib/associations/record_relation/referenced/many_spec.rb +32 -0
- data/spec/lib/associations/record_relation/referenced/one_spec.rb +27 -0
- data/spec/lib/bson_id_spec.rb +48 -0
- data/spec/lib/finders_spec.rb +105 -0
- data/spec/spec_helper.rb +89 -0
- data/spec/support/models/active_record/address.rb +6 -0
- data/spec/support/models/active_record/division.rb +16 -0
- data/spec/support/models/active_record/division_setting.rb +9 -0
- data/spec/support/models/active_record/player.rb +12 -0
- data/spec/support/models/mongoid/league.rb +10 -0
- data/spec/support/models/mongoid/person.rb +9 -0
- data/spec/support/models/mongoid/post.rb +9 -0
- data/spec/support/models/mongoid/stat.rb +8 -0
- data/spec/support/models/mongoid/team.rb +9 -0
- data/spec/support/shared_examples/shared_many_spec.rb +411 -0
- metadata +370 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
class One < Proxy
|
|
4
|
+
|
|
5
|
+
def clear
|
|
6
|
+
target.delete
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def respond_to?(name, include_private = false)
|
|
10
|
+
target.respond_to?(name, include_private) || super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ==(other)
|
|
14
|
+
return false unless other
|
|
15
|
+
return true if target.object_id == other.object_id
|
|
16
|
+
return true if target.attributes == other.attributes
|
|
17
|
+
target == other
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
class Proxy
|
|
4
|
+
|
|
5
|
+
instance_methods.each do |method|
|
|
6
|
+
undef_method(method) unless
|
|
7
|
+
method =~ /(^__|^send|^object_id|^respond_to|^tap)/
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
delegate :bind_one, :unbind_one, to: :binding
|
|
11
|
+
|
|
12
|
+
attr_accessor :base, :target, :__metadata__
|
|
13
|
+
|
|
14
|
+
def init(base, target, metadata)
|
|
15
|
+
@base = base
|
|
16
|
+
@target = target
|
|
17
|
+
@__metadata__ = metadata
|
|
18
|
+
yield(self) if block_given?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def method_missing(name, *args, &block)
|
|
22
|
+
target.send(name, *args, &block)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def klass
|
|
26
|
+
__metadata__ ? __metadata__.klass : nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def ==(other)
|
|
30
|
+
# return false unless other
|
|
31
|
+
# return true if target.object_id == other.object_id
|
|
32
|
+
# return true if target.attributes == other.attributes
|
|
33
|
+
target == other
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Accessors
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
def build_record(name, object, metadata)
|
|
8
|
+
relation = create_record_relation(object, metadata)
|
|
9
|
+
set_record_relation(name, relation)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def set_record_relation(name, object)
|
|
13
|
+
instance_variable_set("@#{name}", object)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create_record_relation(object, metadata)
|
|
17
|
+
type = self.attributes[metadata.inverse_type]
|
|
18
|
+
target = metadata.builder(self, object).build(type)
|
|
19
|
+
target ? metadata.relation.new(self, target, metadata) : nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def get_record_relation(name, metadata, object, reload = false)
|
|
26
|
+
if !reload && (value = instance_variable_get("@#{name}")) != nil
|
|
27
|
+
value
|
|
28
|
+
else
|
|
29
|
+
if object && needs_no_database_query?(object, metadata)
|
|
30
|
+
build_record(name, object, metadata)
|
|
31
|
+
else
|
|
32
|
+
build_record(name, attributes.with_indifferent_access[metadata.key].to_s, metadata)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def needs_no_database_query?(object, metadata)
|
|
38
|
+
object.is_a?(::ActiveRecord::Base) && object.id == attributes[metadata.key]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
module ClassMethods
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def existence_check(name)
|
|
47
|
+
module_eval <<-END
|
|
48
|
+
def #{name}?
|
|
49
|
+
!__send__(:#{name}).blank?
|
|
50
|
+
end
|
|
51
|
+
alias :has_#{name}? :#{name}?
|
|
52
|
+
END
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def record_getter(name, metadata)
|
|
57
|
+
self.instance_eval do
|
|
58
|
+
define_method(name) do |reload = false|
|
|
59
|
+
get_record_relation(name, metadata, nil, reload)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def record_setter(name, metadata)
|
|
65
|
+
self.instance_eval do
|
|
66
|
+
define_method("#{name}=") do |object|
|
|
67
|
+
if value = get_record_relation(name, metadata, object)
|
|
68
|
+
set_record_relation(name, value.substitute(object))
|
|
69
|
+
else
|
|
70
|
+
build_record(name, object, metadata)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "active_mongoid/associations/record_relation/macros"
|
|
2
|
+
require "active_mongoid/associations/record_relation/accessors"
|
|
3
|
+
require "active_mongoid/associations/record_relation/builders"
|
|
4
|
+
require "active_mongoid/associations/record_relation/auto_save"
|
|
5
|
+
require "active_mongoid/associations/record_relation/dependent"
|
|
6
|
+
require "active_mongoid/associations/record_relation/bindings/one"
|
|
7
|
+
require "active_mongoid/associations/record_relation/bindings/in"
|
|
8
|
+
require "active_mongoid/associations/record_relation/bindings/many"
|
|
9
|
+
require "active_mongoid/associations/record_relation/referenced/one"
|
|
10
|
+
require "active_mongoid/associations/record_relation/referenced/in"
|
|
11
|
+
require "active_mongoid/associations/record_relation/referenced/many"
|
|
12
|
+
|
|
13
|
+
module ActiveMongoid
|
|
14
|
+
module Associations
|
|
15
|
+
module RecordRelation
|
|
16
|
+
module Associations
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
attr_accessor :__metadata__
|
|
20
|
+
|
|
21
|
+
included do
|
|
22
|
+
include RecordRelation::Macros
|
|
23
|
+
include RecordRelation::Accessors
|
|
24
|
+
include RecordRelation::Builders
|
|
25
|
+
include RecordRelation::AutoSave
|
|
26
|
+
include RecordRelation::Dependent
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module AutoSave
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
def record_changed_for_autosave?(obj)
|
|
8
|
+
obj.new_record? || obj.changed? || obj.marked_for_destruction?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module ClassMethods
|
|
12
|
+
|
|
13
|
+
def autosave_records(metadata)
|
|
14
|
+
if metadata.autosave?
|
|
15
|
+
save_method = :"autosave_records_for_#{metadata.name}"
|
|
16
|
+
define_method(save_method) do
|
|
17
|
+
if relation = instance_variable_get("@#{metadata.name}")
|
|
18
|
+
Array(relation).each { |d| d.save if record_changed_for_autosave?(d) }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
after_save save_method
|
|
22
|
+
end
|
|
23
|
+
autosave_record_id(metadata)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def autosave_record_id(metadata)
|
|
27
|
+
if metadata.stores_foreign_key?
|
|
28
|
+
save_method = :"autosave_record_id_for_#{metadata.name}"
|
|
29
|
+
define_method(save_method) do
|
|
30
|
+
if relation = instance_variable_get("@#{metadata.name}")
|
|
31
|
+
self.send(metadata.foreign_key_setter, relation.send(metadata.primary_key))
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
before_save save_method
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Bindings
|
|
5
|
+
class In < Associations::Binding
|
|
6
|
+
|
|
7
|
+
def bind_one
|
|
8
|
+
check_inverse!(target)
|
|
9
|
+
bind_foreign_key(base, record_id(target))
|
|
10
|
+
bind_polymorphic_inverse_type(base, target.class.name)
|
|
11
|
+
unless _binding?
|
|
12
|
+
_binding do
|
|
13
|
+
if inverse = __metadata__.inverse(target)
|
|
14
|
+
if set_base_metadata
|
|
15
|
+
if base.referenced_many_documents?
|
|
16
|
+
target.__send__(inverse).push(base)
|
|
17
|
+
else
|
|
18
|
+
target.set_document_relation(inverse, base)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def unbind_one
|
|
27
|
+
inverse = __metadata__.inverse(target)
|
|
28
|
+
bind_foreign_key(base, nil)
|
|
29
|
+
bind_polymorphic_inverse_type(base, nil)
|
|
30
|
+
unless _binding?
|
|
31
|
+
_binding do
|
|
32
|
+
if inverse
|
|
33
|
+
set_base_metadata
|
|
34
|
+
if base.referenced_many_documents?
|
|
35
|
+
target.__send__(inverse).delete(base)
|
|
36
|
+
else
|
|
37
|
+
target.set_document_relation(inverse, nil)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Bindings
|
|
5
|
+
class Many < Associations::Binding
|
|
6
|
+
|
|
7
|
+
def bind_one(record)
|
|
8
|
+
bind_from_relational_parent(record)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def unbind_one(record)
|
|
12
|
+
unbind_from_relational_parent(record)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Bindings
|
|
5
|
+
class One < Associations::Binding
|
|
6
|
+
|
|
7
|
+
def bind_one
|
|
8
|
+
bind_from_relational_parent(target)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def unbind_one
|
|
12
|
+
unbind_from_relational_parent(target)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Builders
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
def record_builder(name, metadata)
|
|
9
|
+
define_method("build_#{name}") do |attributes = {}|
|
|
10
|
+
record = metadata.klass.new(attributes)
|
|
11
|
+
send("#{name}=", record)
|
|
12
|
+
end
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def record_creator(name, metadata)
|
|
17
|
+
define_method("create_#{name}") do |attributes = {}|
|
|
18
|
+
record = metadata.klass.new(attributes)
|
|
19
|
+
obj = send("#{name}=", record)
|
|
20
|
+
record.save
|
|
21
|
+
save if metadata.stores_foreign_key?
|
|
22
|
+
obj
|
|
23
|
+
end
|
|
24
|
+
self
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Dependent
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
|
|
9
|
+
def dependent_records(metadata)
|
|
10
|
+
if metadata.dependent
|
|
11
|
+
dependent_method = :"dependent_records_for_#{metadata.name}"
|
|
12
|
+
define_method(dependent_method) do
|
|
13
|
+
relation = get_record_relation(metadata.name, metadata, nil, true)
|
|
14
|
+
Array(relation).each { |d| d.send(metadata.dependent) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
before_destroy dependent_method
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Macros
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
|
|
9
|
+
def belongs_to_record(name, options = {})
|
|
10
|
+
meta = characterize_association(name, Referenced::In, options)
|
|
11
|
+
reference_record(meta)
|
|
12
|
+
relate_one_to_one_record(name, meta)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def has_one_record(name, options = {})
|
|
16
|
+
meta = characterize_association(name, Referenced::One, options)
|
|
17
|
+
relate_one_to_one_record(name, meta)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def has_many_records(name, options = {})
|
|
21
|
+
meta = characterize_association(name, Referenced::Many, options)
|
|
22
|
+
relate_record(name, meta)
|
|
23
|
+
# document_ids_setter(name, metadata)
|
|
24
|
+
# document_ids_getter(name, metadata)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def reference_record(metadata)
|
|
30
|
+
key = metadata.foreign_key
|
|
31
|
+
if metadata.stores_foreign_key? && !fields.include?(key)
|
|
32
|
+
field(
|
|
33
|
+
key,
|
|
34
|
+
type: Integer,
|
|
35
|
+
default: metadata.foreign_key_default
|
|
36
|
+
)
|
|
37
|
+
if metadata.polymorphic?
|
|
38
|
+
self.polymorphic = true
|
|
39
|
+
field(metadata.inverse_type, type: String)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def relate_one_to_one_record(name, metadata)
|
|
45
|
+
relate_record(name, metadata)
|
|
46
|
+
record_builder(name, metadata)
|
|
47
|
+
record_creator(name, metadata)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def relate_record(name, metadata)
|
|
52
|
+
self.am_relations = am_relations.merge(name.to_s => metadata)
|
|
53
|
+
record_getter(name, metadata)
|
|
54
|
+
record_setter(name, metadata)
|
|
55
|
+
autosave_records(metadata)
|
|
56
|
+
dependent_records(metadata)
|
|
57
|
+
existence_check(name)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module RecordRelation
|
|
4
|
+
module Referenced
|
|
5
|
+
class In < Associations::One
|
|
6
|
+
|
|
7
|
+
def initialize(base, target, metadata)
|
|
8
|
+
init(base, target, metadata) do
|
|
9
|
+
bind_one
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def substitute(replacement)
|
|
14
|
+
unbind_one
|
|
15
|
+
return nil unless replacement
|
|
16
|
+
self.target = normalize(replacement)
|
|
17
|
+
bind_one
|
|
18
|
+
self
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def binding
|
|
24
|
+
Bindings::In.new(base, target, __metadata__)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def normalize(replacement)
|
|
28
|
+
return replacement if replacement.is_a?(::ActiveRecord::Base)
|
|
29
|
+
__metadata__.builder(klass, replacement).build
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class << self
|
|
33
|
+
|
|
34
|
+
def stores_foreign_key?
|
|
35
|
+
true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def foreign_key(name)
|
|
39
|
+
"#{name}#{foreign_key_suffix}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def foreign_key_default
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def foreign_key_suffix
|
|
47
|
+
"_id"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def primary_key_default
|
|
51
|
+
"id"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def macro
|
|
55
|
+
:belongs_to_record
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def builder(base, meta, object)
|
|
59
|
+
ActiveMongoid::Associations::Builders::In.new(base, meta, object)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def criteria(metadata, object, type = nil)
|
|
63
|
+
type.where(metadata.primary_key => object)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|