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,108 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: ../
|
|
3
|
+
specs:
|
|
4
|
+
active_mongoid (0.0.1)
|
|
5
|
+
activerecord
|
|
6
|
+
activesupport
|
|
7
|
+
after_do
|
|
8
|
+
bson_ext
|
|
9
|
+
mongo
|
|
10
|
+
mongoid
|
|
11
|
+
|
|
12
|
+
GEM
|
|
13
|
+
remote: https://rubygems.org/
|
|
14
|
+
specs:
|
|
15
|
+
activemodel (3.2.21)
|
|
16
|
+
activesupport (= 3.2.21)
|
|
17
|
+
builder (~> 3.0.0)
|
|
18
|
+
activerecord (3.2.21)
|
|
19
|
+
activemodel (= 3.2.21)
|
|
20
|
+
activesupport (= 3.2.21)
|
|
21
|
+
arel (~> 3.0.2)
|
|
22
|
+
tzinfo (~> 0.3.29)
|
|
23
|
+
activesupport (3.2.21)
|
|
24
|
+
i18n (~> 0.6, >= 0.6.4)
|
|
25
|
+
multi_json (~> 1.0)
|
|
26
|
+
after_do (0.3.1)
|
|
27
|
+
appraisal (1.0.2)
|
|
28
|
+
bundler
|
|
29
|
+
rake
|
|
30
|
+
thor (>= 0.14.0)
|
|
31
|
+
arel (3.0.3)
|
|
32
|
+
bson (1.11.1)
|
|
33
|
+
bson_ext (1.11.1)
|
|
34
|
+
bson (~> 1.11.1)
|
|
35
|
+
builder (3.0.4)
|
|
36
|
+
coderay (1.1.0)
|
|
37
|
+
coveralls (0.7.1)
|
|
38
|
+
multi_json (~> 1.3)
|
|
39
|
+
rest-client
|
|
40
|
+
simplecov (>= 0.7)
|
|
41
|
+
term-ansicolor
|
|
42
|
+
thor
|
|
43
|
+
database_cleaner (1.3.0)
|
|
44
|
+
diff-lcs (1.2.5)
|
|
45
|
+
docile (1.1.5)
|
|
46
|
+
i18n (0.6.11)
|
|
47
|
+
method_source (0.8.2)
|
|
48
|
+
mime-types (2.4.3)
|
|
49
|
+
mongo (1.11.1)
|
|
50
|
+
bson (= 1.11.1)
|
|
51
|
+
mongoid (3.1.6)
|
|
52
|
+
activemodel (~> 3.2)
|
|
53
|
+
moped (~> 1.4)
|
|
54
|
+
origin (~> 1.0)
|
|
55
|
+
tzinfo (~> 0.3.29)
|
|
56
|
+
moped (1.5.2)
|
|
57
|
+
multi_json (1.10.1)
|
|
58
|
+
netrc (0.8.0)
|
|
59
|
+
origin (1.1.0)
|
|
60
|
+
pry (0.10.1)
|
|
61
|
+
coderay (~> 1.1.0)
|
|
62
|
+
method_source (~> 0.8.1)
|
|
63
|
+
slop (~> 3.4)
|
|
64
|
+
rake (10.3.2)
|
|
65
|
+
rest-client (1.7.2)
|
|
66
|
+
mime-types (>= 1.16, < 3.0)
|
|
67
|
+
netrc (~> 0.7)
|
|
68
|
+
rspec (3.1.0)
|
|
69
|
+
rspec-core (~> 3.1.0)
|
|
70
|
+
rspec-expectations (~> 3.1.0)
|
|
71
|
+
rspec-mocks (~> 3.1.0)
|
|
72
|
+
rspec-core (3.1.7)
|
|
73
|
+
rspec-support (~> 3.1.0)
|
|
74
|
+
rspec-expectations (3.1.2)
|
|
75
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
76
|
+
rspec-support (~> 3.1.0)
|
|
77
|
+
rspec-mocks (3.1.3)
|
|
78
|
+
rspec-support (~> 3.1.0)
|
|
79
|
+
rspec-support (3.1.2)
|
|
80
|
+
simplecov (0.9.1)
|
|
81
|
+
docile (~> 1.1.0)
|
|
82
|
+
multi_json (~> 1.0)
|
|
83
|
+
simplecov-html (~> 0.8.0)
|
|
84
|
+
simplecov-gem-adapter (1.0.1)
|
|
85
|
+
simplecov
|
|
86
|
+
simplecov-html (0.8.0)
|
|
87
|
+
slop (3.6.0)
|
|
88
|
+
sqlite3 (1.3.10)
|
|
89
|
+
term-ansicolor (1.3.0)
|
|
90
|
+
tins (~> 1.0)
|
|
91
|
+
thor (0.19.1)
|
|
92
|
+
tins (1.3.3)
|
|
93
|
+
tzinfo (0.3.42)
|
|
94
|
+
|
|
95
|
+
PLATFORMS
|
|
96
|
+
ruby
|
|
97
|
+
|
|
98
|
+
DEPENDENCIES
|
|
99
|
+
active_mongoid!
|
|
100
|
+
appraisal
|
|
101
|
+
coveralls
|
|
102
|
+
database_cleaner
|
|
103
|
+
mongoid (~> 3.1.0)
|
|
104
|
+
pry
|
|
105
|
+
rspec
|
|
106
|
+
simplecov
|
|
107
|
+
simplecov-gem-adapter
|
|
108
|
+
sqlite3
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
require "active_mongoid/associations"
|
|
2
|
+
require "active_mongoid/bson_id"
|
|
3
|
+
require "active_mongoid/finder_proxy"
|
|
4
|
+
require "active_mongoid/finders"
|
|
5
|
+
|
|
6
|
+
module ActiveMongoid
|
|
7
|
+
BSON = ::Gem::Version.new(Mongoid::VERSION) < ::Gem::Version.new("3.0.0") ? ::BSON : ::Moped::BSON
|
|
8
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require "active_mongoid/associations/metadata"
|
|
2
|
+
require "active_mongoid/associations/builder"
|
|
3
|
+
require "active_mongoid/associations/binding"
|
|
4
|
+
require "active_mongoid/associations/proxy"
|
|
5
|
+
require "active_mongoid/associations/one"
|
|
6
|
+
require "active_mongoid/associations/many"
|
|
7
|
+
require "active_mongoid/associations/builders/in"
|
|
8
|
+
require "active_mongoid/associations/builders/one"
|
|
9
|
+
require "active_mongoid/associations/builders/many"
|
|
10
|
+
require "active_mongoid/associations/document_relation/associations"
|
|
11
|
+
require "active_mongoid/associations/record_relation/associations"
|
|
12
|
+
require "active_mongoid/associations/targets/enumerable"
|
|
13
|
+
require 'after_do'
|
|
14
|
+
|
|
15
|
+
module ActiveMongoid
|
|
16
|
+
module Associations
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
extend ::AfterDo
|
|
21
|
+
class_attribute :am_relations
|
|
22
|
+
self.am_relations = {}
|
|
23
|
+
|
|
24
|
+
if defined?(::ActiveRecord::Base) && self <= ::ActiveRecord::Base
|
|
25
|
+
include DocumentRelation::Associations
|
|
26
|
+
elsif defined?(::Mongoid::Document) && self.included_modules.include?(::Mongoid::Document)
|
|
27
|
+
include RecordRelation::Associations
|
|
28
|
+
else
|
|
29
|
+
raise
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
before :reload do
|
|
33
|
+
am_relations.each_pair do |name, meta|
|
|
34
|
+
if instance_variable_defined?("@#{name}")
|
|
35
|
+
if instance_variable_get("@#{name}")
|
|
36
|
+
remove_instance_variable("@#{name}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def reflect_on_am_association(name)
|
|
44
|
+
self.class.reflect_on_am_association(name.to_s)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def referenced_many_records?
|
|
48
|
+
__metadata__ && __metadata__.macro == :has_many_records
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def referenced_one_record?
|
|
52
|
+
__metadata__ && __metadata__.macro == :has_one_record
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def referenced_many_documents?
|
|
56
|
+
__metadata__ && __metadata__.macro == :has_many_documents
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def referenced_one_document?
|
|
60
|
+
__metadata__ && __metadata__.macro == :has_one_document
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
module ClassMethods
|
|
64
|
+
|
|
65
|
+
def reflect_on_am_association(name)
|
|
66
|
+
am_relations[name.to_s]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
def characterize_association(name, relation, options)
|
|
72
|
+
ActiveMongoid::Associations::Metadata.new({
|
|
73
|
+
:relation => relation,
|
|
74
|
+
:inverse_class_name => self.name,
|
|
75
|
+
:name => name
|
|
76
|
+
}.merge(options))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'mongoid/threaded'
|
|
2
|
+
|
|
3
|
+
module ActiveMongoid
|
|
4
|
+
module Associations
|
|
5
|
+
class Binding
|
|
6
|
+
include ::Mongoid::Threaded::Lifecycle
|
|
7
|
+
|
|
8
|
+
attr_reader :base, :target, :__metadata__
|
|
9
|
+
|
|
10
|
+
def initialize(base, target, metadata)
|
|
11
|
+
@base = base
|
|
12
|
+
@target = target
|
|
13
|
+
@__metadata__ = metadata
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def check_inverse!(object)
|
|
19
|
+
# check for inverse relation and raise exception when not
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def bind_foreign_key(base, id)
|
|
24
|
+
return if base.send(__metadata__.foreign_key) == id
|
|
25
|
+
base.send(__metadata__.foreign_key_setter, id)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def bind_polymorphic_type(base, name)
|
|
29
|
+
if __metadata__.type
|
|
30
|
+
base.send(__metadata__.type_setter, name)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def bind_polymorphic_inverse_type(base, name)
|
|
35
|
+
if __metadata__.inverse_type
|
|
36
|
+
base.send(__metadata__.inverse_type_setter, name)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def bind_inverse(object, inverse)
|
|
41
|
+
unless _binding?
|
|
42
|
+
_binding do
|
|
43
|
+
if object.respond_to?(__metadata__.inverse_setter)
|
|
44
|
+
object.send(__metadata__.inverse_setter, inverse)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def record_id(base)
|
|
51
|
+
base.send(__metadata__.primary_key)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def set_base_metadata
|
|
55
|
+
inverse_metadata = __metadata__.inverse_metadata(target)
|
|
56
|
+
if inverse_metadata != __metadata__ && !inverse_metadata.nil?
|
|
57
|
+
base.__metadata__ = inverse_metadata
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def bind_from_relational_parent(object)
|
|
62
|
+
check_inverse!(object)
|
|
63
|
+
bind_foreign_key(object, record_id(base))
|
|
64
|
+
bind_polymorphic_type(object, base.class.name)
|
|
65
|
+
bind_inverse(object, base)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def unbind_from_relational_parent(object)
|
|
69
|
+
check_inverse!(object)
|
|
70
|
+
bind_foreign_key(object, nil)
|
|
71
|
+
bind_polymorphic_type(object, nil)
|
|
72
|
+
bind_inverse(object, nil)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
class Builder
|
|
4
|
+
|
|
5
|
+
attr_reader :base, :__metadata__, :object
|
|
6
|
+
|
|
7
|
+
def initialize(base, metadata, object)
|
|
8
|
+
@base = base
|
|
9
|
+
@__metadata__ = metadata
|
|
10
|
+
@object = object
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def klass
|
|
16
|
+
@klass ||= __metadata__.klass
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def query?
|
|
20
|
+
obj = Array(object).first
|
|
21
|
+
!obj.is_a?(::Mongoid::Document) && !obj.is_a?(::ActiveRecord::Base) && !obj.nil?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module Builders
|
|
4
|
+
class In < Builder
|
|
5
|
+
|
|
6
|
+
def build(type = nil)
|
|
7
|
+
return object unless query?
|
|
8
|
+
return nil if object.blank?
|
|
9
|
+
type = type.constantize if type and type.is_a?(String)
|
|
10
|
+
model = type ? type : __metadata__.klass
|
|
11
|
+
__metadata__.criteria(object, model).first
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module Builders
|
|
4
|
+
class Many < Builder
|
|
5
|
+
|
|
6
|
+
def build(type = nil)
|
|
7
|
+
return object unless query?
|
|
8
|
+
return [] if object.is_a?(Array)
|
|
9
|
+
__metadata__.criteria(object, base.class)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module Builders
|
|
4
|
+
class One < Builder
|
|
5
|
+
|
|
6
|
+
def build(type = nil)
|
|
7
|
+
return object unless query?
|
|
8
|
+
return nil if base.new_record?
|
|
9
|
+
__metadata__.criteria(object, base.class).first
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module ActiveMongoid
|
|
2
|
+
module Associations
|
|
3
|
+
module DocumentRelation
|
|
4
|
+
module Accessors
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
def build_document(name, object, metadata)
|
|
8
|
+
relation = create_document_relation(object, metadata)
|
|
9
|
+
set_document_relation(name, relation)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def set_document_relation(name, object)
|
|
13
|
+
instance_variable_set("@#{name}", object)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create_document_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
|
+
private
|
|
23
|
+
|
|
24
|
+
def get_document_relation(name, metadata, object, reload = false)
|
|
25
|
+
if !reload && (value = instance_variable_get("@#{name}")) != nil
|
|
26
|
+
value
|
|
27
|
+
else
|
|
28
|
+
if object && needs_no_database_query?(object, metadata)
|
|
29
|
+
build_document(name, object, metadata)
|
|
30
|
+
else
|
|
31
|
+
build_document(name, self.send(metadata.key), metadata)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def needs_no_database_query?(object, metadata)
|
|
37
|
+
object.is_a?(::Mongoid::Document) && object.id.to_s == attributes[metadata.key].to_s
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
module ClassMethods
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def existence_check(name)
|
|
46
|
+
module_eval <<-END
|
|
47
|
+
def #{name}?
|
|
48
|
+
!__send__(:#{name}).blank?
|
|
49
|
+
end
|
|
50
|
+
alias :has_#{name}? :#{name}?
|
|
51
|
+
END
|
|
52
|
+
self
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Getters
|
|
56
|
+
|
|
57
|
+
def document_getter(name, metadata)
|
|
58
|
+
self.instance_eval do
|
|
59
|
+
define_method(name) do |reload = false|
|
|
60
|
+
get_document_relation(name, metadata, nil, reload)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def document_id_getter(name, metadata)
|
|
66
|
+
self.instance_eval do
|
|
67
|
+
define_method("#{name}_id") do
|
|
68
|
+
attribute = read_attribute("#{name}_id")
|
|
69
|
+
attribute.nil? ? nil : ::ActiveMongoid::BSON::ObjectId.from_string(attribute)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def document_setter(name, metadata)
|
|
75
|
+
self.instance_eval do
|
|
76
|
+
define_method("#{name}=") do |object|
|
|
77
|
+
if value = get_document_relation(name, metadata, object)
|
|
78
|
+
set_document_relation(name, value.substitute(object))
|
|
79
|
+
else
|
|
80
|
+
build_document(name, object, metadata)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def document_id_setter(name, metadata)
|
|
87
|
+
self.instance_eval do
|
|
88
|
+
define_method("#{name}_id=") do |bson_id|
|
|
89
|
+
attribute = bson_id.nil? ? nil : bson_id.to_s
|
|
90
|
+
write_attribute("#{name}_id", attribute)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|