Class: ClientSideValidations::ActiveRecord::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/client_side_validations/active_record/middleware.rb

Class Method Summary collapse

Class Method Details

.class?(klass) ⇒ Boolean

Returns:

  • (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

Returns:

  • (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