validates_schema 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,46 @@ class ActiveRecord::Base
4
4
 
5
5
  def inherited(klass)
6
6
  super(klass)
7
+ begin
8
+ add_schema_based_validations(klass)
9
+ return # it worked, so just return
10
+ rescue ActiveRecord::StatementInvalid => e
11
+ # puts "e.message: #{e.message}"
12
+
13
+ begin
14
+ # The ActiveRecord::StatementInvalid could be a result
15
+ # of an abstract superclass, so let's reset the table name
16
+ # and try again:
17
+ klass.reset_table_name
18
+ add_schema_based_validations(klass)
19
+ return # it worked, so just return
20
+ rescue ActiveRecord::StatementInvalid => e
21
+ # puts "e.message: #{e.message}"
22
+ end
23
+ end # rescue ActiveRecord::StatementInvalid
24
+
25
+ # Ok, so it failed, let's add a hook around setting
26
+ # the table name and try that. Hopefully all should be well then.
27
+ unless klass.respond_to?(:set_table_name_with_schema_validations)
28
+ klass.class_eval do
29
+ class << self
30
+ def set_table_name_with_schema_validations(*args)
31
+ set_table_name_without_schema_validations(*args)
32
+ return if abstract_class
33
+ add_schema_based_validations(self)
34
+ end
35
+ alias_method_chain :set_table_name, :schema_validations
36
+ end
37
+ end
38
+ end
39
+
40
+ end # inherited
41
+
42
+ def add_schema_based_validations(klass = self)
43
+ klass.reset_column_information
7
44
  # puts klass
45
+ # puts "klass.arel_table: #{klass.arel_table.inspect}"
46
+ validations = []
8
47
  klass.arel_table.columns.each do |c|
9
48
  detail = c.column
10
49
  next if detail.name == 'id'
@@ -19,15 +58,21 @@ class ActiveRecord::Base
19
58
  options[:presence] = true unless detail.null
20
59
 
21
60
  unless options.empty?
22
- # puts "validates :#{detail.name.to_sym}, #{options.inspect}"
61
+ validations << "validates :#{detail.name.to_sym}, #{options.inspect}"
23
62
  klass.class_eval do
24
63
  validates detail.name.to_sym, options || {}
25
64
  end
26
65
  end
27
-
28
66
  end
29
- end
67
+ # uncomment to see a list of generated validations:
68
+ # unless validations.empty?
69
+ # puts "#{klass}:"
70
+ # validations.each do |line|
71
+ # puts " #{line}"
72
+ # end
73
+ # end
74
+ end # add_schema_based_validations
30
75
 
31
- end
76
+ end # class << self
32
77
 
33
- end
78
+ end # ActiveRecord::Base
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
+ - 1
7
8
  - 0
8
- - 0
9
- version: 1.0.0
9
+ version: 1.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - markbates
@@ -60,7 +60,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- hash: 1478591478662090228
63
+ hash: 372854992706096450
64
64
  segments:
65
65
  - 0
66
66
  version: "0"