custom_fields 2.0.0.rc1 → 2.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/custom_fields/extensions/mongoid/fields/i18n.rb +1 -1
- data/lib/custom_fields/extensions/mongoid/fields/internal/localized.rb +4 -2
- data/lib/custom_fields/extensions/mongoid/fields.rb +2 -1
- data/lib/custom_fields/source.rb +152 -156
- data/lib/custom_fields/target.rb +1 -5
- data/lib/custom_fields/types/date.rb +9 -13
- data/lib/custom_fields/types/select.rb +26 -34
- data/lib/custom_fields/version.rb +3 -1
- metadata +26 -37
- data/lib/custom_fields/types_old/boolean.rb +0 -13
- data/lib/custom_fields/types_old/category.rb +0 -107
- data/lib/custom_fields/types_old/date.rb +0 -49
- data/lib/custom_fields/types_old/default.rb +0 -44
- data/lib/custom_fields/types_old/file.rb +0 -27
- data/lib/custom_fields/types_old/has_many/proxy_collection.rb +0 -103
- data/lib/custom_fields/types_old/has_many/reverse_lookup_proxy_collection.rb +0 -101
- data/lib/custom_fields/types_old/has_many.rb +0 -100
- data/lib/custom_fields/types_old/has_one.rb +0 -60
- data/lib/custom_fields/types_old/string.rb +0 -13
- data/lib/custom_fields/types_old/text.rb +0 -15
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: custom_fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157006780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.4.
|
21
|
+
version: 2.4.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157006780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157019860 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.1.3
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157019860
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: carrierwave-mongoid
|
38
|
-
requirement: &
|
38
|
+
requirement: &2157016280 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.1.3
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2157016280
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: yard
|
49
|
-
requirement: &
|
49
|
+
requirement: &2157013880 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.7.3
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2157013880
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: bson
|
60
|
-
requirement: &
|
60
|
+
requirement: &2157012260 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.3.1
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2157012260
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mongo
|
71
|
-
requirement: &
|
71
|
+
requirement: &2157048080 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.3.1
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2157048080
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: bson_ext
|
82
|
-
requirement: &
|
82
|
+
requirement: &2157046440 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.3.1
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2157046440
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: mocha
|
93
|
-
requirement: &
|
93
|
+
requirement: &2157043280 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 0.9.12
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *2157043280
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rspec
|
104
|
-
requirement: &
|
104
|
+
requirement: &2157051560 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '2.6'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *2157051560
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: database_cleaner
|
115
|
-
requirement: &
|
115
|
+
requirement: &2157070900 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: 0.6.7
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *2157070900
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: RedCloth
|
126
|
-
requirement: &
|
126
|
+
requirement: &2157069160 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ~>
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: 4.2.8
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *2157069160
|
135
135
|
description: Manage custom fields to a mongoid document or a collection. This module
|
136
136
|
is one of the core features we implemented in our custom cms named Locomotive.
|
137
137
|
email:
|
@@ -163,17 +163,6 @@ files:
|
|
163
163
|
- lib/custom_fields/types/select.rb
|
164
164
|
- lib/custom_fields/types/string.rb
|
165
165
|
- lib/custom_fields/types/text.rb
|
166
|
-
- lib/custom_fields/types_old/boolean.rb
|
167
|
-
- lib/custom_fields/types_old/category.rb
|
168
|
-
- lib/custom_fields/types_old/date.rb
|
169
|
-
- lib/custom_fields/types_old/default.rb
|
170
|
-
- lib/custom_fields/types_old/file.rb
|
171
|
-
- lib/custom_fields/types_old/has_many/proxy_collection.rb
|
172
|
-
- lib/custom_fields/types_old/has_many/reverse_lookup_proxy_collection.rb
|
173
|
-
- lib/custom_fields/types_old/has_many.rb
|
174
|
-
- lib/custom_fields/types_old/has_one.rb
|
175
|
-
- lib/custom_fields/types_old/string.rb
|
176
|
-
- lib/custom_fields/types_old/text.rb
|
177
166
|
- lib/custom_fields/version.rb
|
178
167
|
- lib/custom_fields.rb
|
179
168
|
- config/locales/de.yml
|
@@ -194,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
183
|
version: '0'
|
195
184
|
segments:
|
196
185
|
- 0
|
197
|
-
hash:
|
186
|
+
hash: 2817461240862898588
|
198
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
188
|
none: false
|
200
189
|
requirements:
|
@@ -1,107 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module Category
|
4
|
-
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
embeds_many :category_items, :class_name => 'CustomFields::Types::Category::Item'
|
9
|
-
|
10
|
-
validates_associated :category_items
|
11
|
-
|
12
|
-
accepts_nested_attributes_for :category_items, :allow_destroy => true
|
13
|
-
|
14
|
-
register_type :category, BSON::ObjectId
|
15
|
-
end
|
16
|
-
|
17
|
-
module InstanceMethods
|
18
|
-
|
19
|
-
def ordered_category_items
|
20
|
-
self.category_items.sort { |a, b| (a.position || 0) <=> (b.position || 0) }
|
21
|
-
end
|
22
|
-
|
23
|
-
def category_names
|
24
|
-
self.category_items.collect(&:name)
|
25
|
-
end
|
26
|
-
|
27
|
-
def category_ids
|
28
|
-
self.category_items.collect(&:_id)
|
29
|
-
end
|
30
|
-
|
31
|
-
def category_to_hash
|
32
|
-
{ 'category_items' => self.category_items.collect(&:to_hash) }
|
33
|
-
end
|
34
|
-
|
35
|
-
def apply_category_type(klass)
|
36
|
-
klass.class_eval <<-EOF
|
37
|
-
|
38
|
-
def self.#{self.safe_alias}_items
|
39
|
-
self.lookup_custom_field('#{self._name}').ordered_category_items
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.#{self.safe_alias}_names
|
43
|
-
self.#{self.safe_alias}_items.collect(&:name)
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.group_by_#{self.safe_alias}(list_method = nil)
|
47
|
-
groups = (if self.embedded?
|
48
|
-
list_method ||= self.association_name
|
49
|
-
self._parent.send(list_method)
|
50
|
-
else
|
51
|
-
list_method ||= :all
|
52
|
-
self.send(list_method)
|
53
|
-
end).to_a.group_by(&:#{self._name})
|
54
|
-
|
55
|
-
self.#{self.safe_alias}_items.collect do |category|
|
56
|
-
{
|
57
|
-
:name => category.name,
|
58
|
-
:items => groups[category._id] || []
|
59
|
-
}.with_indifferent_access
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def #{self.safe_alias}=(id)
|
64
|
-
category = self.class.#{self.safe_alias}_items.find { |item| item.name == id || item._id.to_s == id.to_s }
|
65
|
-
category_id = category ? category._id : nil
|
66
|
-
self.send(:'#{self._name}=', category_id)
|
67
|
-
end
|
68
|
-
|
69
|
-
def #{self.safe_alias}
|
70
|
-
category_id = self.send(:#{self._name})
|
71
|
-
category = self.class.#{self.safe_alias}_items.find { |item| item._id == category_id }
|
72
|
-
category ? category.name : nil
|
73
|
-
end
|
74
|
-
EOF
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
class Item
|
80
|
-
|
81
|
-
include Mongoid::Document
|
82
|
-
|
83
|
-
field :name
|
84
|
-
field :position, :type => Integer, :default => 0
|
85
|
-
|
86
|
-
embedded_in :custom_field, :inverse_of => :category_items
|
87
|
-
|
88
|
-
validates_presence_of :name
|
89
|
-
|
90
|
-
def to_hash(more = {})
|
91
|
-
self.fields.keys.inject({}) do |memo, meth|
|
92
|
-
memo[meth] = self.send(meth.to_sym); memo
|
93
|
-
end.merge({
|
94
|
-
'id' => self._id,
|
95
|
-
'new_record' => self.new_record?,
|
96
|
-
'errors' => self.errors
|
97
|
-
}).merge(more)
|
98
|
-
end
|
99
|
-
|
100
|
-
def to_json
|
101
|
-
ActiveSupport::JSON.encode(self.to_hash)
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module Date
|
4
|
-
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
register_type :date, ::Date
|
9
|
-
end
|
10
|
-
|
11
|
-
module InstanceMethods
|
12
|
-
|
13
|
-
def apply_date_type(klass)
|
14
|
-
|
15
|
-
klass.class_eval <<-EOF
|
16
|
-
|
17
|
-
def #{self.safe_alias}
|
18
|
-
self.#{self._name}
|
19
|
-
end
|
20
|
-
|
21
|
-
def #{self.safe_alias}=(value)
|
22
|
-
if value.is_a?(::String) && !value.blank?
|
23
|
-
date = ::Date._strptime(value, I18n.t('date.formats.default'))
|
24
|
-
value = ::Date.new(date[:year], date[:mon], date[:mday])
|
25
|
-
end
|
26
|
-
|
27
|
-
self.#{self._name} = value
|
28
|
-
end
|
29
|
-
|
30
|
-
def formatted_#{self.safe_alias}
|
31
|
-
self.#{self._name}.strftime(I18n.t('date.formats.default')) rescue nil
|
32
|
-
end
|
33
|
-
|
34
|
-
alias formatted_#{self.safe_alias}= #{self.safe_alias}=
|
35
|
-
EOF
|
36
|
-
|
37
|
-
def add_date_validation(klass)
|
38
|
-
if self.required?
|
39
|
-
klass.validates_presence_of self.safe_alias.to_sym, :"formatted_#{self.safe_alias}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module Default
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
cattr_accessor :field_types
|
8
|
-
end
|
9
|
-
|
10
|
-
module InstanceMethods
|
11
|
-
|
12
|
-
def apply_default_type(klass)
|
13
|
-
klass.class_eval <<-EOF
|
14
|
-
alias :#{self.safe_alias} :#{self._name}
|
15
|
-
alias :#{self.safe_alias}= :#{self._name}=
|
16
|
-
EOF
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_default_validation(klass)
|
20
|
-
# add validation if required field
|
21
|
-
if self.required?
|
22
|
-
klass.validates_presence_of self.safe_alias.to_sym
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
module ClassMethods
|
29
|
-
|
30
|
-
def register_type(kind, klass = ::String)
|
31
|
-
self.field_types ||= {}
|
32
|
-
self.field_types[kind.to_sym] = klass unless klass.nil?
|
33
|
-
|
34
|
-
self.class_eval <<-EOF
|
35
|
-
def #{kind.to_s}?
|
36
|
-
self.kind.downcase == '#{kind}' rescue false
|
37
|
-
end
|
38
|
-
EOF
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module File
|
4
|
-
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
register_type :file, nil # do not create the default field
|
9
|
-
end
|
10
|
-
|
11
|
-
module InstanceMethods
|
12
|
-
|
13
|
-
def apply_file_type(klass)
|
14
|
-
|
15
|
-
klass.mount_uploader self._name, FileUploader
|
16
|
-
|
17
|
-
self.apply_default_type(klass)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
class FileUploader < ::CarrierWave::Uploader::Base
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module HasMany
|
4
|
-
|
5
|
-
class ProxyCollection
|
6
|
-
|
7
|
-
attr_accessor :parent, :target_klass, :field_name, :ids, :values
|
8
|
-
|
9
|
-
def initialize(parent, target_klass, field_name, options = {})
|
10
|
-
self.parent = parent
|
11
|
-
|
12
|
-
self.target_klass = target_klass
|
13
|
-
|
14
|
-
self.field_name = field_name
|
15
|
-
|
16
|
-
self.ids, self.values = [], []
|
17
|
-
end
|
18
|
-
|
19
|
-
def find(id)
|
20
|
-
id = BSON::ObjectId(id) unless id.is_a?(BSON::ObjectId)
|
21
|
-
self.values.detect { |obj_id| obj_id == id }
|
22
|
-
end
|
23
|
-
|
24
|
-
def update(values)
|
25
|
-
values = [] if values.blank? || self.target_klass.nil?
|
26
|
-
|
27
|
-
self.ids = values.collect { |obj| self.id_for_sure(obj) }.compact
|
28
|
-
self.values = values.collect { |obj| self.object_for_sure(obj) }.compact
|
29
|
-
end
|
30
|
-
|
31
|
-
# just before the parent gets saved, reflect the changes to the parent object
|
32
|
-
def store_values
|
33
|
-
self.parent.write_attribute(self.field_name, self.ids)
|
34
|
-
end
|
35
|
-
|
36
|
-
# once the parent object gets saved, call this method, kind of hook or callback
|
37
|
-
def persist
|
38
|
-
true
|
39
|
-
end
|
40
|
-
|
41
|
-
def <<(*args)
|
42
|
-
args.flatten.compact.each do |obj|
|
43
|
-
self.ids << self.id_for_sure(obj)
|
44
|
-
self.values << self.object_for_sure(obj)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
alias :push :<<
|
49
|
-
|
50
|
-
def size
|
51
|
-
self.values.size
|
52
|
-
end
|
53
|
-
|
54
|
-
alias :length :size
|
55
|
-
|
56
|
-
def reload
|
57
|
-
self.collection(true)
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
61
|
-
def method_missing(name, *args, &block)
|
62
|
-
self.values.send(name, *args, &block)
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
|
67
|
-
def id_for_sure(id_or_object)
|
68
|
-
id_or_object.respond_to?(:_id) ? id_or_object._id : id_or_object
|
69
|
-
end
|
70
|
-
|
71
|
-
def object_for_sure(id_or_object)
|
72
|
-
if id_or_object.respond_to?(:_id)
|
73
|
-
id_or_object
|
74
|
-
else
|
75
|
-
self.collection.find(id_or_object)
|
76
|
-
end
|
77
|
-
rescue # target_klass does not exist anymore or the target element has been removed since
|
78
|
-
nil
|
79
|
-
end
|
80
|
-
|
81
|
-
def collection(reload_embedded = false)
|
82
|
-
return [] if self.target_klass.nil?
|
83
|
-
|
84
|
-
if self.target_klass.embedded?
|
85
|
-
if @embedded_collection.nil? || reload_embedded
|
86
|
-
parent_target = self.target_klass._parent
|
87
|
-
|
88
|
-
parent_target = parent_target.reload if reload_embedded
|
89
|
-
|
90
|
-
@embedded_collection = parent_target.send(self.target_klass.association_name)
|
91
|
-
end
|
92
|
-
|
93
|
-
@embedded_collection
|
94
|
-
else
|
95
|
-
self.target_klass
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
module CustomFields
|
2
|
-
module Types
|
3
|
-
module HasMany
|
4
|
-
|
5
|
-
class ReverseLookupProxyCollection < ProxyCollection
|
6
|
-
|
7
|
-
attr_accessor :reverse_lookup_field, :previous_state
|
8
|
-
|
9
|
-
def initialize(parent, target_klass, field_name, options = {})
|
10
|
-
super
|
11
|
-
|
12
|
-
self.reverse_lookup_field = options[:reverse_lookup_field].to_sym
|
13
|
-
|
14
|
-
if self.parent.new_record?
|
15
|
-
self.previous_state = { :ids => [], :values => [] }
|
16
|
-
else
|
17
|
-
self.reload
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def store_values
|
22
|
-
true # do nothing
|
23
|
-
end
|
24
|
-
|
25
|
-
def persist
|
26
|
-
(self.previous_state[:values] - self.values).each do |object|
|
27
|
-
self.set_foreign_key_and_position(object, nil)
|
28
|
-
end
|
29
|
-
|
30
|
-
self.values.each_with_index do |object, position|
|
31
|
-
self.set_foreign_key_and_position(object, self.parent._id, position)
|
32
|
-
end
|
33
|
-
|
34
|
-
if self.target_klass.embedded?
|
35
|
-
self.target_klass._parent.save!(:validate => false)
|
36
|
-
end
|
37
|
-
|
38
|
-
self.reorder # update positions in the internal collection (self.values)
|
39
|
-
|
40
|
-
self.reset_previous_state
|
41
|
-
end
|
42
|
-
|
43
|
-
def <<(id_or_object)
|
44
|
-
object = self.object_for_sure(id_or_object)
|
45
|
-
|
46
|
-
foreign_key = object.send(self.reverse_lookup_field)
|
47
|
-
|
48
|
-
if foreign_key && foreign_key != self.parent._id
|
49
|
-
raise ArgumentError, "Object #{object} cannot be added: already has a different foreign key"
|
50
|
-
end
|
51
|
-
|
52
|
-
self.ids << self.id_for_sure(object._id)
|
53
|
-
self.values << self.object_for_sure(object)
|
54
|
-
end
|
55
|
-
|
56
|
-
def reload
|
57
|
-
self.update(self.reverse_collection(true))
|
58
|
-
|
59
|
-
self.reset_previous_state
|
60
|
-
end
|
61
|
-
|
62
|
-
protected
|
63
|
-
|
64
|
-
def reverse_collection(reload = false)
|
65
|
-
self.collection(reload).where(self.reverse_lookup_field => self.parent._id).order_by([[:"#{self.reverse_lookup_field}_position", :asc]])
|
66
|
-
end
|
67
|
-
|
68
|
-
def reorder
|
69
|
-
self.values.sort! { |a, b| a.send(:"#{self.reverse_lookup_field}_position") <=> b.send(:"#{self.reverse_lookup_field}_position") }
|
70
|
-
end
|
71
|
-
|
72
|
-
def set_foreign_key_and_position(object, value, position = nil)
|
73
|
-
objects = [object]
|
74
|
-
|
75
|
-
if self.target_klass.embedded?
|
76
|
-
# Fixme (Did): objects in self.values are different from the ones in self.collection
|
77
|
-
objects << self.collection.find(object._id)
|
78
|
-
end
|
79
|
-
|
80
|
-
objects.each do |o|
|
81
|
-
o.send("#{self.reverse_lookup_field}=".to_sym, value)
|
82
|
-
o.send("#{self.reverse_lookup_field}_position=".to_sym, position)
|
83
|
-
end
|
84
|
-
|
85
|
-
unless self.target_klass.embedded?
|
86
|
-
object.save(:validate => false)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def reset_previous_state
|
91
|
-
self.previous_state = {
|
92
|
-
:ids => self.ids.clone,
|
93
|
-
:values => self.values.clone
|
94
|
-
}
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|