Module: ForeignKeyValidation::ModelExtension::ClassMethods

Defined in:
lib/foreign_key_validation/model_extension.rb

Instance Method Summary collapse

Instance Method Details

#validate_foreign_keys(opt = {}) ⇒ Object

Raises:

  • (ArgumentError)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/foreign_key_validation/model_extension.rb', line 15

def validate_foreign_keys(opt={})
  validate_against  = (opt[:on] || :user).to_s
  reflections       = self.reflect_on_all_associations(:belongs_to).map(&:name).map(&:to_s)
  validate_with     = ((Array(opt[:with]).map(&:to_s) if opt[:with]) || reflections).reject {|n| n == validate_against}

  raise ArgumentError, "No foreign key #{validate_against} on #{self.table_name} table!" unless reflections.include?(validate_against)
  raise ArgumentError, "Unknown relation in #{validate_with}!" unless validate_with.all? {|k| reflections.include?(k) }

  define_method "validate_foreign_keys_on_#{validate_against}" do
    validate_with.each do |relation|
      validate_foreign_key(validate_against, relation)
    end
  end
  private "validate_foreign_keys_on_#{validate_against}".to_sym

  before_validation "validate_foreign_keys_on_#{validate_against}"
end