Class: AssignableValues::ActiveRecord::Restriction::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/assignable_values/active_record/restriction/base.rb

Direct Known Subclasses

BelongsToAssociation, ScalarAttribute

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, property, options, &values) ⇒ Base

Returns a new instance of Base.



8
9
10
11
12
13
14
15
16
17
# File 'lib/assignable_values/active_record/restriction/base.rb', line 8

def initialize(model, property, options, &values)
  @model = model
  @property = property
  @options = options
  @values = values
  ensure_values_given
  setup_default
  define_assignable_values_method
  setup_validation
end

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def default
  @default
end

#modelObject (readonly)

Returns the value of attribute model.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def model
  @model
end

#optionsObject (readonly)

Returns the value of attribute options.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def options
  @options
end

#propertyObject (readonly)

Returns the value of attribute property.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def property
  @property
end

#secondary_defaultObject (readonly)

Returns the value of attribute secondary_default.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def secondary_default
  @secondary_default
end

#valuesObject (readonly)

Returns the value of attribute values.



6
7
8
# File 'lib/assignable_values/active_record/restriction/base.rb', line 6

def values
  @values
end

Instance Method Details

#assignable_value?(record, value) ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/assignable_values/active_record/restriction/base.rb', line 36

def assignable_value?(record, value)
  assignable_values(record).include?(value)
end

#assignable_values(record, decorate = false) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/assignable_values/active_record/restriction/base.rb', line 40

def assignable_values(record, decorate = false)
  assignable_values = []
  parsed_values = parsed_assignable_values(record)
  current_values = parsed_values.delete(:values)
  old_value = previously_saved_value(record)
  if old_value.present? && !current_values.include?(old_value)
    assignable_values << old_value
  end
  assignable_values += current_values
  parsed_values.each do |meta_name, meta_content|
    assignable_values.singleton_class.send(:define_method, meta_name) { meta_content }
  end
  if decorate
    assignable_values = decorate_values(assignable_values)
  end
  assignable_values
end

#not_included_error_messageObject



32
33
34
# File 'lib/assignable_values/active_record/restriction/base.rb', line 32

def not_included_error_message
  I18n.t('errors.messages.inclusion', :default => 'is not included in the list')
end

#set_default(record) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/assignable_values/active_record/restriction/base.rb', line 58

def set_default(record)
  if record.new_record? && record.send(property).nil?
    default_value = evaluate_default(record, default)
    begin
      if secondary_default? && !assignable_value?(record, default_value)
        secondary_default_value = evaluate_default(record, secondary_default)
        if assignable_value?(record, secondary_default_value)
          default_value = secondary_default_value
        end
      end
    rescue AssignableValues::DelegateUnavailable
      # skip secondary defaults if querying assignable values from a nil delegate
    end
    record.send("#{property}=", default_value)
  end
  true
end

#validate_record(record) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/assignable_values/active_record/restriction/base.rb', line 19

def validate_record(record)
  value = current_value(record)
  unless allow_blank? && value.blank?
    begin
      unless assignable_value?(record, value)
        record.errors.add(property, not_included_error_message)
      end
    rescue DelegateUnavailable
      # if the delegate is unavailable, the validation is skipped
    end
  end
end