class Nullalign::Introspectors::ValidatesPresenceOf

Public Instance Methods

instances(model) click to toggle source
# File lib/nullalign/introspectors/validates_presence_of.rb, line 6
def instances(model)
  model.validators.select do |v|
    v.class == ActiveRecord::Validations::PresenceValidator && (v.options.keys & %i(on if unless)).empty?
  end
end
missing_nonnull_constraints(model) click to toggle source
# File lib/nullalign/introspectors/validates_presence_of.rb, line 31
def missing_nonnull_constraints(model)
  return [] unless model.connection.tables.include? model.table_name
  existing_nonnull_constraints = TableData.new.nonnull_constraints(model)

  desired_nonnull_constraints(model).reject do |index|
    existing_nonnull_constraints.include?(index)
  end
end

Private Instance Methods

desired_nonnull_constraints(model) click to toggle source
# File lib/nullalign/introspectors/validates_presence_of.rb, line 12
def desired_nonnull_constraints(model)
  instances(model).map do |v|
    v.attributes.map do |attribute|
      # This next bit is to avoid a false positive in the case where a validator uses
      # an association name rather than the field name (i.e. user vs user_id).
      association = model.reflect_on_all_associations.detect {|r| r.name == attribute }
      attribute_value = if association != nil
        association.foreign_key
      else
        attribute
      end
      Nullalign::NonnullConstraint.new(model,
                                 model.table_name,
                                 attribute_value)
    end
  end.flatten
end