diff --git a/db/seeds.rb b/db/seeds.rb index 335a35f..3143d07 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -20,4 +20,6 @@ end # Formulas will be deleted as dependent on Quantities #[Source, Quantity, Unit].each { |model| model.defaults.delete_all } -require 'seeds/units.rb' +# To clear contents of the table, use #truncate instead of #delete_all. This +# avoids foreign_key constraints errors. +require_relative 'seeds/units.rb' diff --git a/db/seeds/templates/units.erb b/db/seeds/templates/units.erb index c2d4f88..719c059 100644 --- a/db/seeds/templates/units.erb +++ b/db/seeds/templates/units.erb @@ -1,9 +1,9 @@ Unit.transaction do - Unit.defaults.delete_all + ActiveRecord::Base.connection.truncate(Unit.table_name) <% Unit.defaults.ordered.each do |unit| %> <%= "\n" if unit.base.nil? %> - unit_<%= unit.symbol %> = - Unit.create symbol: "<%= unit.symbol %>",<% unless unit.base.nil? %> base: unit_<%= unit.base.symbol %>, multiplier: <%= unit.multiplier.to_scientific %>,<% end %> - description: "<%= unit.description %>" + units['<%= unit.symbol %>'] = + Unit.create symbol: '<%= unit.symbol %>',<% unless unit.base.nil? %> base: units['<%= unit.base.symbol %>'], multiplier: '<%= unit.multiplier.to_scientific %>',<% end %> + description: '<%= unit.description %>' <% end %> end diff --git a/db/seeds/units.rb b/db/seeds/units.rb index 1b79bf9..261f196 100644 --- a/db/seeds/units.rb +++ b/db/seeds/units.rb @@ -1,36 +1,36 @@ Unit.transaction do - Unit.defaults.delete_all + ActiveRecord::Base.connection.truncate(Unit.table_name) - unit_1 = - Unit.create symbol: "1", - description: "dimensionless, one" - unit_ppm = - Unit.create symbol: "ppm", base: unit_1, multiplier: 1e-6, - description: "parts per million" - unit_‱ = - Unit.create symbol: "‱", base: unit_1, multiplier: 1e-4, - description: "basis point" - unit_‰ = - Unit.create symbol: "‰", base: unit_1, multiplier: 1e-3, - description: "promille" - unit_% = - Unit.create symbol: "%", base: unit_1, multiplier: 1e-2, - description: "percent" + units['1'] = + Unit.create symbol: '1', + description: 'dimensionless, one' + units['ppm'] = + Unit.create symbol: 'ppm', base: units['1'], multiplier: '1e-6', + description: 'parts per million' + units['‱'] = + Unit.create symbol: '‱', base: units['1'], multiplier: '1e-4', + description: 'basis point' + units['‰'] = + Unit.create symbol: '‰', base: units['1'], multiplier: '1e-3', + description: 'promille' + units['%'] = + Unit.create symbol: '%', base: units['1'], multiplier: '1e-2', + description: 'percent' - unit_g = - Unit.create symbol: "g", - description: "gram" - unit_ug = - Unit.create symbol: "ug", base: unit_g, multiplier: 1e-6, - description: "microgram" - unit_mg = - Unit.create symbol: "mg", base: unit_g, multiplier: 1e-3, - description: "milligram" - unit_kg = - Unit.create symbol: "kg", base: unit_g, multiplier: 1e3, - description: "kilogram" + units['g'] = + Unit.create symbol: 'g', + description: 'gram' + units['µg'] = + Unit.create symbol: 'µg', base: units['g'], multiplier: '1e-6', + description: 'microgram' + units['mg'] = + Unit.create symbol: 'mg', base: units['g'], multiplier: '1e-3', + description: 'milligram' + units['kg'] = + Unit.create symbol: 'kg', base: units['g'], multiplier: '1e3', + description: 'kilogram' - unit_kcal = - Unit.create symbol: "kcal", - description: "kilocalorie" + units['kcal'] = + Unit.create symbol: 'kcal', + description: 'kilocalorie' end diff --git a/lib/core_ext/active_model/validations/numericality_validates_precision_and_scale.rb b/lib/core_ext/active_model/validations/numericality_validates_precision_and_scale.rb index a8fe744..42be128 100644 --- a/lib/core_ext/active_model/validations/numericality_validates_precision_and_scale.rb +++ b/lib/core_ext/active_model/validations/numericality_validates_precision_and_scale.rb @@ -4,6 +4,9 @@ module CoreExt::ActiveModel::Validations::NumericalityValidatesPrecisionAndScale if options[:precision] || options[:scale] attr_type = record.class.type_for_attribute(attr_name) + # For conversion of 'value' to BigDecimal 'ndigits' is not supplied intentionally, + # to avoid silent rounding. It is only required for conversion from Float and + # Rational, which should not happen. value = BigDecimal(value) unless value.is_a? BigDecimal if options[:precision] && (value.precision > attr_type.precision) record.errors.add(attr_name, :precision_exceeded, **filtered_options(attr_type.precision))