Class: ClientSideValidations::ActiveRecord::Middleware
- Inherits:
-
Object
- Object
- ClientSideValidations::ActiveRecord::Middleware
- Defined in:
- lib/client_side_validations/active_record/middleware.rb
Class Method Summary collapse
- .class?(klass) ⇒ Boolean
- .find_topmost_superclass(klass) ⇒ Object
- .sql_statement(klass, attribute, value, params) ⇒ Object
- .type_cast_value(column, value) ⇒ Object
- .unique?(klass, attribute, value, params) ⇒ Boolean
Class Method Details
.class?(klass) ⇒ Boolean
4 5 6 |
# File 'lib/client_side_validations/active_record/middleware.rb', line 4 def self.class?(klass) klass.abstract_class.blank? && klass < ::ActiveRecord::Base end |
.find_topmost_superclass(klass) ⇒ Object
56 57 58 59 60 61 62 |
# File 'lib/client_side_validations/active_record/middleware.rb', line 56 def self.find_topmost_superclass(klass) if class?(klass.superclass) find_topmost_superclass(klass.superclass) else klass end end |
.sql_statement(klass, attribute, value, params) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/client_side_validations/active_record/middleware.rb', line 19 def self.sql_statement(klass, attribute, value, params) sql = [] t = klass.arel_table if params[:case_sensitive] == 'true' sql << 'BINARY' if t.engine.connection.adapter_name =~ /^mysql/i sql << t[attribute].eq(value).to_sql else escaped_value = value.gsub(/[%_]/, '\\\\\0') sql << "#{t[attribute].matches(escaped_value).to_sql} ESCAPE '\\'" end sql << "AND #{t[klass.primary_key].not_eq(params[:id]).to_sql}" if params[:id] (params[:scope] || {}).each do |scope_attribute, scope_value| scope_value = type_cast_value(klass.columns_hash[scope_attribute], scope_value) sql << "AND #{t[scope_attribute].eq(scope_value).to_sql}" end sql.join ' ' end |
.type_cast_value(column, value) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/client_side_validations/active_record/middleware.rb', line 41 def self.type_cast_value(column, value) value = if column.respond_to?(:type_cast) column.type_cast(value) else column.type_cast_from_database(value) end if column.limit && value.is_a?(String) value.mb_chars[0, column.limit] else value end end |
.unique?(klass, attribute, value, params) ⇒ Boolean
8 9 10 11 12 13 14 15 16 17 |
# File 'lib/client_side_validations/active_record/middleware.rb', line 8 def self.unique?(klass, attribute, value, params) klass = find_topmost_superclass(klass) column = klass.columns_hash[attribute.to_s] value = type_cast_value(column, value) sql = sql_statement(klass, attribute, value, params) relation = Arel::Nodes::SqlLiteral.new(sql) klass.where(relation).empty? end |