enum_fields 0.0.5 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d2ba45a5964fee807097e941cd817f7e1df72ace9094c8bf2620c7462bd06d2
4
- data.tar.gz: 4b9c320af51de403c10631881531efe3455d2ac5946df3b5798d03e825e06ce3
3
+ metadata.gz: 9a282e3cb07038a6db32bfed63217bc85ec6901541b26e373e1c5a78e4ee4106
4
+ data.tar.gz: 26cc2fccb3171185ac16e0edeab889b235c64b7d7b289b9958234c5da7064e73
5
5
  SHA512:
6
- metadata.gz: 6d16f74b5eb526d1cd7ea287a75b5a261679d432be001736b13e0ce52f442bc5806176e8e5020ae605b475eea608f83af25cd487eed1d181d50af30ad1a24dbf
7
- data.tar.gz: e5ea072511fa65e0ea6f5221f9c39406af917533aecca0a6e962be8bf743fc17740033b32064d59579fac25f5cebfd337e2eb002b96546e14bd830275d8bc34e
6
+ metadata.gz: b989a5b41c4e07609bf00dd08db9555ee7f544cda58f91ca4db114ba3a66fbeecfd892077ae22f96721bfd40478b609fe77bbea123853e2e5ba4aa10354a1bb4
7
+ data.tar.gz: 2e1c2fbdeee50ee23a328cd160b25ee1d86b52d0e4a42198841c167d1fff231045340171adfbacf0fe5d406ce4bcd83d5a4d151aff63dedeeaf54de9e1dc7832
@@ -11,6 +11,7 @@ module EnumFields
11
11
  @accessor = accessor.to_sym
12
12
  @column_name = options.fetch(:column, @accessor).to_sym
13
13
  @definition = Definition.new(definition)
14
+ @options = options
14
15
  end
15
16
 
16
17
  def define!
@@ -143,13 +144,56 @@ module EnumFields
143
144
  end
144
145
 
145
146
  def define_validation!
146
- return if @definition.blank?
147
+ return unless column_validatable?
147
148
 
149
+ if column_polymorphic_association_name.present?
150
+ define_polymorphic_validation!
151
+ else
152
+ define_standard_validation!
153
+ end
154
+ end
155
+
156
+ def define_standard_validation!
148
157
  valid_values = @definition.values.pluck(:value)
158
+
149
159
  @model_class.validates(@column_name, inclusion: {
150
160
  in: valid_values,
151
161
  allow_nil: true,
152
162
  })
153
163
  end
164
+
165
+ def define_polymorphic_validation!
166
+ association_name = column_polymorphic_association_name
167
+ column_name = @column_name
168
+ accessor = @accessor
169
+
170
+ @model_class.validate do
171
+ association_obj = respond_to?(association_name) ? public_send(association_name) : nil
172
+ valid_values = self.class.public_send("#{accessor}_values")
173
+
174
+ if association_obj
175
+ errors.add(association_name, "must be one of: #{valid_values.join(', ')}") unless valid_values.include?(association_obj.class.name)
176
+ else
177
+ column_value = attributes[column_name.to_s]
178
+ next if column_value.nil?
179
+
180
+ errors.add(column_name, "must be one of: #{valid_values.join(', ')}") unless valid_values.include?(column_value)
181
+ end
182
+ end
183
+ end
184
+
185
+ def column_validatable?
186
+ @definition.present? && @options.fetch(:validate, true)
187
+ end
188
+
189
+ def column_polymorphic_association_name
190
+ return nil unless @model_class.respond_to?(:reflect_on_all_associations)
191
+
192
+ reflection = @model_class.reflect_on_all_associations(:belongs_to).find do |r|
193
+ r.options[:polymorphic] && "#{r.name}_type" == @column_name.to_s
194
+ end
195
+
196
+ reflection&.name
197
+ end
154
198
  end
155
199
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EnumFields
4
- VERSION = '0.0.5'
4
+ VERSION = '0.1.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enum_fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kinnell Shah