module ActiveRecordBaseExtension::ClassMethods

Public Instance Methods

_all() click to toggle source

override if necessary @return ActiveRecordRelation

# File lib/baseapi/active_record/base_extension.rb, line 44
def _all
  self.all
end
_belongs_to(models, table, hash) click to toggle source

override or create method 'belongs_to{table}' if necessary @param ActiveRecordRelation models @param String table table name @param Hash hash column name => search values

# File lib/baseapi/active_record/base_extension.rb, line 97
def _belongs_to(models, table, hash)
  relation_match(models, table, hash)
end
_has_many(models, table, hash) click to toggle source

override or create method 'has_many{table}' if necessary @param ActiveRecordRelation models @param String table table name @param Hash hash column name => search values

# File lib/baseapi/active_record/base_extension.rb, line 105
def _has_many(models, table, hash)
  relation_match(models, table, hash)
end
_where(models, column, values) click to toggle source

override or create method 'where{column}' if necessary @param ActiveRecordRelation models @param String column column name @param Array/String values search values

# File lib/baseapi/active_record/base_extension.rb, line 52
def _where(models, column, values)
  column_match(models, column, values)
end
column_call(models, column, values, callable, operator:'or') click to toggle source

@param ActiveRecordRelation models @param String column column name @param Array/String values search values @param Callable callable Arel

# File lib/baseapi/active_record/base_extension.rb, line 80
def column_call(models, column, values, callable, operator:'or')
  base_arel = nil
  column_values = values.instance_of?(Array) ? values : [values]
  column_values.each do |value|
    if column.present? and value.present?
      arel = callable.call(column, value)
      base_arel = arel_merge(base_arel, arel, operator: operator)
    end
  end
  models.where!(base_arel)
  models
end
column_like(models, column, values, operator:'or') click to toggle source

column like search @param ActiveRecordRelation models @param String column column name @param Array/String values search values @option String operator 'or' or 'and'

# File lib/baseapi/active_record/base_extension.rb, line 71
def column_like(models, column, values, operator:'or')
  callable = arel_like(self)
  column_call(models, column, values, callable, operator: operator)
end
column_match(models, column, values, operator: 'or') click to toggle source

column exact match search @param ActiveRecordRelation models @param String column column name @param Array/String values search values @option String operator 'or' or 'and'

# File lib/baseapi/active_record/base_extension.rb, line 61
def column_match(models, column, values, operator: 'or')
  callable = arel_match(self)
  column_call(models, column, values, callable, operator: operator)
end
get_associations(relate = nil) click to toggle source

get relation tables @param String relate 'belongs_to','hasmany'.. @return Hash associations relation name => talbe name array

# File lib/baseapi/active_record/base_extension.rb, line 153
def get_associations(relate = nil)
  associations = {
    'belongs_to' => [],
    'has_many'   => [],
  }
  self.reflect_on_all_associations.each do |association|
    associations.each do |key, value|
      if association.class.to_s == "ActiveRecord::Reflection::#{key.camelize}Reflection"
        associations[key].push(association.name.to_s)
      end
    end
  end
  relate.present? ? associations[relate] : associations
end
get_reserved_word_prefix() click to toggle source

reserved word prefix(count,page,order,orderby…) @return String

# File lib/baseapi/active_record/base_extension.rb, line 38
def get_reserved_word_prefix
  @reserved_word_prefix
end
relation_call(models, hash, callable, operator:'or') click to toggle source

@param ActiveRecordRelation models @param Hash hash column name => search values @param Callable callable Arel @option String operator 'or' or 'and'

# File lib/baseapi/active_record/base_extension.rb, line 133
def relation_call(models, hash, callable, operator:'or')
  base_arel = nil
  hash.each do |column, values|
    if column.present? and values.present?
      relation_values = values.instance_of?(Array) ? values : [values]
      relation_values.each do |value|
        if column.present? and value.present?
          arel = callable.call(column, value)
          base_arel = arel_merge(base_arel, arel, operator: operator)
        end
      end
    end
  end
  models.where!(base_arel)
  models
end
relation_like(models, table, hash, operator: 'or') click to toggle source

like search @param ActiveRecordRelation models @param String table table name @param Hash hash column name => search values @option String operator 'or' or 'and'

# File lib/baseapi/active_record/base_extension.rb, line 124
def relation_like(models, table, hash, operator: 'or')
  callable = arel_like(table.camelize.singularize.constantize)
  relation_call(models, hash, callable, operator: operator)
end
relation_match(models, table, hash, operator: 'or') click to toggle source

Exact match search @param ActiveRecordRelation models @param String table table name @param Hash hash column name => search values @option String operator 'or' or 'and'

# File lib/baseapi/active_record/base_extension.rb, line 114
def relation_match(models, table, hash, operator: 'or')
  callable = arel_match(table.camelize.singularize.constantize)
  relation_call(models, hash, callable, operator: operator)
end

Private Instance Methods

arel_like(model_class) click to toggle source

create arel like @param Model model_class ActiveRecord class @return Callable create arel function

# File lib/baseapi/active_record/base_extension.rb, line 175
def arel_like(model_class)
  return ->(column, value){
    arel = model_class.arel_table[column.to_sym]
    arel = arel.matches("%#{escape_value(value)}%")
    arel = arel.not if value_is_not?(value)
    arel
  }
end
arel_match(model_class) click to toggle source

create arel match @param Model model_class ActiveRecord class @return Callable create arel function

# File lib/baseapi/active_record/base_extension.rb, line 187
def arel_match(model_class)
  return ->(column, value){
    arel = model_class.arel_table[column.to_sym]
    if value_is_null?(value)
      arel = arel.eq(nil)
    elsif value_is_empty?(value)
      arel = arel.eq(nil).send('or', model_class.arel_table[column.to_sym].eq(''))
    elsif value_is_sign?(value)
      arel = arel.send(get_sign_method(get_sign(value)), escape_value(value))
    else
      arel = arel.eq(escape_value(value))
    end
    arel = arel.not if value_is_not?(value)
    arel
  }
end
arel_merge(base_arel, arel, operator: 'or') click to toggle source

create arel match @param Arel base_arel base arel @param Arel arel merge target arel @return Arel merged arel object

# File lib/baseapi/active_record/base_extension.rb, line 208
def arel_merge(base_arel, arel, operator: 'or')
  return arel if base_arel.nil?
  base_arel.send(operator, arel)
end
clean_hash!(param) click to toggle source

hash params empty delete @param hash param

# File lib/baseapi/active_record/base_extension.rb, line 321
def clean_hash!(param)
  recursive_delete_if = -> (param) {
    param.each do |key, value|
      if value.is_a?(Hash)
        recursive_delete_if.call(value)
      end
    end
    param.delete_if { |k, v| v.blank? }
  }
  recursive_delete_if.call(param) if param.is_a?(Hash)
end
escape_not_value(value) click to toggle source

escape `!` @param String value @return String

# File lib/baseapi/active_record/base_extension.rb, line 216
def escape_not_value(value)
  value = value[1..value.length-1] if value[0] == '!'
  return value
end
escape_quotation_value(value) click to toggle source

escape `'`,`“` @param String value @return String

# File lib/baseapi/active_record/base_extension.rb, line 236
def escape_quotation_value(value)
  if ((/^[\'].+?[\']$/ =~ value) != nil) or ((/^[\"].+?[\"]$/ =~ value) != nil)
    value = value[1..value.length-2]
  end
  return value
end
escape_sign_value(value) click to toggle source

escape `>`,`<`,`=<`,`=>` @param String value @return String

# File lib/baseapi/active_record/base_extension.rb, line 224
def escape_sign_value(value)
  if value.length >= 2 and ['<=', '>='].include?(value[0..1])
    value = value[2..value.length-1]
  elsif ['<', '>'].include?(value[0])
    value = value[1..value.length-1]
  end
  return value
end
escape_sql_value(value) click to toggle source

escape `%`,`_` @param String value @return String

# File lib/baseapi/active_record/base_extension.rb, line 246
def escape_sql_value(value)
  value.gsub(/[%_]/, '\\\\\0')
end
escape_value(value) click to toggle source

removal of the `!`,`>`,`<`,`=>`,`=<`,`'`,`“` @param String value @return String

# File lib/baseapi/active_record/base_extension.rb, line 253
def escape_value(value)
  value = escape_not_value(value)
  value = escape_sign_value(value)
  value = escape_quotation_value(value)
  value = escape_sql_value(value)
  return value
end
get_sign(value) click to toggle source

get less or greater @param String value @return String sign > or < or => or <=

# File lib/baseapi/active_record/base_extension.rb, line 293
def get_sign(value)
  value = escape_not_value(value)
  if value.length >= 2 and ['<=', '>='].include?(value[0..1])
    sign = value[0..1]
  elsif ['<', '>'].include?(value[0])
    sign = value[0]
  end
  sign
end
get_sign_method(sign) click to toggle source

less or greater to arel method @param String sign > or < or => or <= @return String Arel method

# File lib/baseapi/active_record/base_extension.rb, line 306
def get_sign_method(sign)
  case sign
  when '<'
    return 'lt'
  when '<='
    return 'lteq'
  when '>'
    return 'gt'
  when '>='
    return 'gteq'
  end
end
value_is_empty?(value) click to toggle source

request empty? @param String value @return Boolean

# File lib/baseapi/active_record/base_extension.rb, line 278
def value_is_empty?(value)
  escape_not_value(value).upcase == 'EMPTY'
end
value_is_not?(value) click to toggle source

request not? @param String value @return Boolean

# File lib/baseapi/active_record/base_extension.rb, line 264
def value_is_not?(value)
  value[0] == '!'
end
value_is_null?(value) click to toggle source

request null? @param String value @return Boolean

# File lib/baseapi/active_record/base_extension.rb, line 271
def value_is_null?(value)
  escape_not_value(value).upcase == 'NULL'
end
value_is_sign?(value) click to toggle source

request less or greater? @param String value @return Boolean

# File lib/baseapi/active_record/base_extension.rb, line 285
def value_is_sign?(value)
  value = escape_not_value(value)
  value.length >= 2 and ['<=', '>='].include?(value[0..1]) || ['<', '>'].include?(value[0])
end