custom_fielder 0.5.8 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/custom_fielder/field.rb +11 -0
- data/app/models/custom_fielder/{custom_field.rb → value.rb} +48 -24
- data/db/migrate/20160525133243_create_custom_fielder_values.rb +13 -0
- data/db/migrate/{20160525133922_create_custom_fielder_field_attributes.rb → 20160525133922_create_custom_fielder_fields.rb} +5 -2
- data/lib/custom_fielder/custom_fieldable.rb +16 -15
- data/lib/custom_fielder/version.rb +1 -1
- metadata +5 -5
- data/app/models/custom_fielder/field_attributes.rb +0 -18
- data/db/migrate/20160525133243_create_custom_fielder_custom_fields.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba1a35b8ba0a749348e09d583d71ca7289338b1d
|
4
|
+
data.tar.gz: 0c82c5566b04597e87ec82659a4fa46fe36cc173
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb0fdd4f0c2cb97a7155a5753a939d63efe10b4d777a5acb5311caad7eda66630d3873ee1a9b95e239bd316d168b8c099197922ae407d1628aff9b449a9d6880
|
7
|
+
data.tar.gz: 1ab60451a738ac239bd040b7b9f91752cc46149cbb92637d4a374524d46ed6af5997dd15bfbf097a63a5618b351e1d4ae0ddf607a96ed5bb39fb3349aadbd82c
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module CustomFielder
|
2
|
+
class Field < ActiveRecord::Base
|
3
|
+
has_many :values
|
4
|
+
|
5
|
+
validates :name, presence: true
|
6
|
+
validates :field_type, presence: true,
|
7
|
+
inclusion: { in: %w[Array Integer Float Date DateTime Boolean String] }
|
8
|
+
validates :fieldable_type, presence: true
|
9
|
+
validates :allow_blank, inclusion: { in: [true, false] }
|
10
|
+
end
|
11
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module CustomFielder
|
2
|
-
class
|
2
|
+
class Value < ActiveRecord::Base
|
3
3
|
include TypeCheckingHelper
|
4
4
|
include DeserializationHelper
|
5
5
|
|
@@ -8,18 +8,16 @@ module CustomFielder
|
|
8
8
|
validate :check_type
|
9
9
|
validate :check_allow_blank
|
10
10
|
validate :check_allowed_values
|
11
|
+
validate :check_fieldable_type
|
11
12
|
|
12
|
-
belongs_to :
|
13
|
-
belongs_to :
|
13
|
+
belongs_to :field, dependent: :destroy
|
14
|
+
belongs_to :fieldable, polymorphic: true
|
14
15
|
|
15
16
|
scope :active, -> { where(active: true) }
|
16
17
|
scope :inactive, -> { where(active: false) }
|
17
18
|
|
18
|
-
scope :
|
19
|
-
scope :
|
20
|
-
scope :fields_with_class_and_attributes, -> (klass, field_attrs) do
|
21
|
-
where(custom_fieldable_type: klass, field_attributes: field_attrs)
|
22
|
-
end
|
19
|
+
scope :values_with_field, -> (field) { where(field: field) }
|
20
|
+
scope :values_with_class, -> (klass) { where(fieldable_type: klass) }
|
23
21
|
|
24
22
|
##
|
25
23
|
# Because everything is stored as string with ActiveRecord
|
@@ -35,25 +33,25 @@ module CustomFielder
|
|
35
33
|
##
|
36
34
|
# Activates all CustomFields that belong to passed field attributes
|
37
35
|
#
|
38
|
-
# @param field_attrs [
|
36
|
+
# @param field_attrs [CustomFielder::Field]
|
39
37
|
#
|
40
38
|
# @return [Nil]
|
41
39
|
#
|
42
|
-
def activate_field_for_all(
|
43
|
-
|
44
|
-
|
40
|
+
def activate_field_for_all(field)
|
41
|
+
values = all.where(field: field)
|
42
|
+
values.each { |value| value.active = true; value.save }
|
45
43
|
end
|
46
44
|
|
47
45
|
##
|
48
46
|
# Deactivates all CustomFields that belong to passed field attributes
|
49
47
|
#
|
50
|
-
# @param field_attrs [
|
48
|
+
# @param field_attrs [CustomFielder::Field]
|
51
49
|
#
|
52
50
|
# @return [Nil]
|
53
51
|
#
|
54
|
-
def deactivate_field_for_all(
|
55
|
-
|
56
|
-
|
52
|
+
def deactivate_field_for_all(field)
|
53
|
+
values = all.where(field: field)
|
54
|
+
values.each { |value| value.active = false; value.save }
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
@@ -65,7 +63,16 @@ module CustomFielder
|
|
65
63
|
# @return [String]
|
66
64
|
#
|
67
65
|
def type
|
68
|
-
@type ||=
|
66
|
+
@type ||= field.field_type
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Gets the fieldable type from the field
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
#
|
74
|
+
def field_fieldable_type
|
75
|
+
@field_fieldable_type ||= field.fieldable_type
|
69
76
|
end
|
70
77
|
|
71
78
|
##
|
@@ -74,7 +81,7 @@ module CustomFielder
|
|
74
81
|
# @return [Boolean]
|
75
82
|
#
|
76
83
|
def allow_blank
|
77
|
-
@allow_blank ||=
|
84
|
+
@allow_blank ||= field.allow_blank
|
78
85
|
end
|
79
86
|
|
80
87
|
##
|
@@ -84,8 +91,8 @@ module CustomFielder
|
|
84
91
|
#
|
85
92
|
def allowed_values
|
86
93
|
@allowed_values ||= begin
|
87
|
-
unless
|
88
|
-
deserialize('Array',
|
94
|
+
unless field.allowed_values.nil?
|
95
|
+
deserialize('Array', field.allowed_values)
|
89
96
|
else
|
90
97
|
nil
|
91
98
|
end
|
@@ -98,7 +105,7 @@ module CustomFielder
|
|
98
105
|
# @return [String]
|
99
106
|
#
|
100
107
|
def default
|
101
|
-
@default ||=
|
108
|
+
@default ||= field.default
|
102
109
|
end
|
103
110
|
|
104
111
|
##
|
@@ -142,6 +149,13 @@ module CustomFielder
|
|
142
149
|
value_not_allowed_error unless allowed_values.include?(value)
|
143
150
|
end
|
144
151
|
|
152
|
+
##
|
153
|
+
# @return [Nil] Adds error if invalid
|
154
|
+
#
|
155
|
+
def check_fieldable_type
|
156
|
+
value_fieldable_type_error unless field_fieldable_type == fieldable_type
|
157
|
+
end
|
158
|
+
|
145
159
|
##
|
146
160
|
# If a value is passed that does not match field type adds
|
147
161
|
# a mismatch error
|
@@ -149,7 +163,7 @@ module CustomFielder
|
|
149
163
|
# @return [Nil]
|
150
164
|
#
|
151
165
|
def value_mismatch_error
|
152
|
-
errors.add(:value, '
|
166
|
+
errors.add(:value, 'Value passed does not match field type')
|
153
167
|
end
|
154
168
|
|
155
169
|
##
|
@@ -159,7 +173,7 @@ module CustomFielder
|
|
159
173
|
# @return [Nil]
|
160
174
|
#
|
161
175
|
def value_blank_error
|
162
|
-
errors.add(:value, '
|
176
|
+
errors.add(:value, 'Blank value not allowed')
|
163
177
|
end
|
164
178
|
|
165
179
|
##
|
@@ -169,7 +183,17 @@ module CustomFielder
|
|
169
183
|
# @return [Nil]
|
170
184
|
#
|
171
185
|
def value_not_allowed_error
|
172
|
-
errors.add(:value, '
|
186
|
+
errors.add(:value, 'Value passed not in options')
|
187
|
+
end
|
188
|
+
|
189
|
+
##
|
190
|
+
# If a value is trying to be assigned to a model that is different
|
191
|
+
# than the one the field was made for adds value fieldable type error
|
192
|
+
#
|
193
|
+
# @return [Nil]
|
194
|
+
#
|
195
|
+
def value_fieldable_type_error
|
196
|
+
errors.add(:value, "Can't assign value to a #{fieldable_type} when field is for #{field_fieldable_type}")
|
173
197
|
end
|
174
198
|
|
175
199
|
##
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateCustomFielderValues < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :custom_fielder_values do |t|
|
4
|
+
t.references :fieldable, polymorphic: true, null: false, index: { name: 'index_values_on_fieldable_type_and_fieldable_id' }
|
5
|
+
t.integer :field_id, null: false
|
6
|
+
t.boolean :active, null: false, default: true
|
7
|
+
t.string :value
|
8
|
+
t.text :note
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,8 +1,9 @@
|
|
1
|
-
class
|
1
|
+
class CreateCustomFielderFields < ActiveRecord::Migration
|
2
2
|
def change
|
3
|
-
create_table :
|
3
|
+
create_table :custom_fielder_fields do |t|
|
4
4
|
t.string :name, null: false
|
5
5
|
t.string :field_type, null: false
|
6
|
+
t.string :fieldable_type, null: false
|
6
7
|
t.string :default
|
7
8
|
t.boolean :allow_blank, null: false, default: false
|
8
9
|
t.string :allowed_values
|
@@ -10,5 +11,7 @@ class CreateCustomFielderFieldAttributes < ActiveRecord::Migration
|
|
10
11
|
|
11
12
|
t.timestamps null: false
|
12
13
|
end
|
14
|
+
|
15
|
+
add_index :custom_fielder_fields, [:name, :fieldable_type], unique: true
|
13
16
|
end
|
14
17
|
end
|
@@ -3,21 +3,22 @@ module CustomFielder
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
has_many :
|
7
|
-
|
6
|
+
has_many :custom_fielder_fields,
|
7
|
+
through: :custom_fielder_values,
|
8
|
+
class_name: 'CustomFielder::Field',
|
9
|
+
source: :field
|
10
|
+
|
11
|
+
has_many :custom_fielder_values,
|
12
|
+
as: :fieldable,
|
8
13
|
dependent: :destroy,
|
9
|
-
class_name: 'CustomFielder::
|
14
|
+
class_name: 'CustomFielder::Value'
|
15
|
+
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
class_name: 'CustomFielder::FieldAttributes',
|
14
|
-
source: :field_attributes
|
17
|
+
accepts_nested_attributes_for :custom_fielder_values, allow_destroy: true
|
18
|
+
accepts_nested_attributes_for :custom_fielder_fields, allow_destroy: false
|
15
19
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
alias_method :custom_fields, :custom_fielder_custom_fields
|
20
|
-
alias_method :custom_field_attributes, :custom_fielder_field_attributes
|
20
|
+
alias_method :custom_fields, :custom_fielder_fields
|
21
|
+
alias_method :custom_field_values, :custom_fielder_values
|
21
22
|
|
22
23
|
##
|
23
24
|
# Returns a hash where the keys are the field names
|
@@ -26,9 +27,9 @@ module CustomFielder
|
|
26
27
|
# @return [Hash]
|
27
28
|
#
|
28
29
|
def get_custom_fields_with_values
|
29
|
-
|
30
|
-
field_name =
|
31
|
-
h[field_name] =
|
30
|
+
custom_field_values.inject(Hash.new) do |h, field_value|
|
31
|
+
field_name = field_value.field.name
|
32
|
+
h[field_name] = field_value.value; h
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: custom_fielder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Hurst
|
@@ -67,12 +67,12 @@ files:
|
|
67
67
|
- app/helpers/custom_fielder/application_helper.rb
|
68
68
|
- app/helpers/custom_fielder/deserialization_helper.rb
|
69
69
|
- app/helpers/custom_fielder/type_checking_helper.rb
|
70
|
-
- app/models/custom_fielder/
|
71
|
-
- app/models/custom_fielder/
|
70
|
+
- app/models/custom_fielder/field.rb
|
71
|
+
- app/models/custom_fielder/value.rb
|
72
72
|
- app/views/layouts/custom_fielder/application.html.erb
|
73
73
|
- config/routes.rb
|
74
|
-
- db/migrate/
|
75
|
-
- db/migrate/
|
74
|
+
- db/migrate/20160525133243_create_custom_fielder_values.rb
|
75
|
+
- db/migrate/20160525133922_create_custom_fielder_fields.rb
|
76
76
|
- lib/custom_fielder.rb
|
77
77
|
- lib/custom_fielder/custom_fieldable.rb
|
78
78
|
- lib/custom_fielder/engine.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module CustomFielder
|
2
|
-
class FieldAttributes < ActiveRecord::Base
|
3
|
-
has_many :custom_fields
|
4
|
-
|
5
|
-
before_save :serialize_allowed_values
|
6
|
-
|
7
|
-
validates :name, presence: true
|
8
|
-
validates :field_type, presence: true,
|
9
|
-
inclusion: { in: %w[Array Integer Float Date DateTime Boolean String] }
|
10
|
-
validates :allow_blank, inclusion: { in: [true, false] }
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def serialize_allowed_values
|
15
|
-
allowed_values = allowed_values.to_s
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class CreateCustomFielderCustomFields < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :custom_fielder_custom_fields do |t|
|
4
|
-
t.references :custom_fieldable, polymorphic: true, index: { name: 'index_custom_fields_on_fieldable_type_and_fieldable_id' }, null: false
|
5
|
-
t.integer :field_attributes_id, null: false
|
6
|
-
t.boolean :active, null: false, default: true
|
7
|
-
t.string :value
|
8
|
-
t.text :note
|
9
|
-
|
10
|
-
t.timestamps null: false
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|