custom_fields 2.0.0.rc1 → 2.0.0.rc2
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/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
|