module UiBibz::Concerns::Models::Searchable

Public Class Methods

create_model() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 39
def self.create_model
  @arguments[:model].nil? ? self : @arguments[:model].to_s.camelize.classify.constantize
end
fetch_column_args() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 104
def self.fetch_column_args
  column_args = {}
  column_args = [@arguments[:sortable]].flatten.detect { |f| f[:column] = @params[:column_name] } || {} if !@arguments[:sortable].nil? && @params[:custom_sort]
  column_args
end
generate_count_sql(sql) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 91
def self.generate_count_sql(sql)
  sq = "SELECT * FROM (#{sql.group("#{table_name}.id").to_sql}) countable ORDER BY countable.count #{@tmp_params[:direction] || asc}"
  paginate_by_sql(sq, page: @tmp_params[:page], per_page: @tmp_params[:per_page])
end
generate_default_sql(sql) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 83
def self.generate_default_sql(sql)
  if sorting?
    sql.paginate(page: @tmp_params[:page], per_page: @tmp_params[:per_page])
  else
    sql.reorder(order_sql).paginate(page: @tmp_params[:page], per_page: @tmp_params[:per_page])
  end
end
generate_parameters() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 17
def self.generate_parameters
  {
    controller: @params[:controller],
    actions_controller: @arguments[:actions_controller] || @params[:controller],
    param_id: @params[:id],
    params: @params,
    direction: @tmp_params[:direction],
    search: @tmp_params[:search],
    sort: @tmp_params[:sort],
    action: @params[:action],
    column_id: @params[:column_id],
    id: store_id,
    records: search_sort_paginate,
    searchable_attributes: @searchable_attributes,
    model: create_model
  }
end
generate_parent_sort_query(sql) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 100
def self.generate_parent_sort_query(sql)
  sql.select("#{table_name}2.*, #{@tmp_params[:sort]} AS parent_name").from("#{table_name} #{table_name}2").joins("LEFT OUTER JOIN #{table_name} ON #{table_name}2.parent_id = #{table_name}.id")
end
generate_select_count_sort_query(sql, column_args) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 96
def self.generate_select_count_sort_query(sql, column_args)
  sql.select("#{table_name}.*, count(#{column_args[:column]}.*)")
end
generate_sql(sql, column_args) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 79
def self.generate_sql(sql, column_args)
  column_args[:count].nil? ? generate_default_sql(sql) : generate_count_sql(sql)
end
good_store_id?() click to toggle source

If there's several table in the same page

# File lib/ui_bibz/concerns/models/searchable.rb, line 165
def self.good_store_id?
  @params[:store_id].nil? ? true : store_id == @params[:store_id]
end
initialize_params() click to toggle source

If there is more one table in html page

# File lib/ui_bibz/concerns/models/searchable.rb, line 44
def self.initialize_params
  @tmp_params = (session_store || { 'per_page' => @arguments[:per_page] || 30 }).with_indifferent_access

  return unless good_store_id?

  @tmp_params = {
    'search' => @params[:search] || @tmp_params['search'],
    'per_page' => @params[:per_page] || @tmp_params['per_page'] || @arguments[:per_page],
    'page' => @params[:page],
    'sort' => @params[:sort] || @tmp_params['sort'],
    'direction' => @params[:direction] || @tmp_params['direction']
  }.with_indifferent_access

  @session[store_id] = @tmp_params
end
new_search?() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 169
def self.new_search?
  @params[:link_type] == 'search'
end
order_sql() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 152
def self.order_sql
  sorting? ? "#{table_name}.id asc" : "#{@tmp_params[:sort]} #{@tmp_params[:direction]}"
end
search_by_query(sql) click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 114
def self.search_by_query(sql)
  raise 'Add searchable_attributes method in Model' if @searchable_attributes.nil?

  sql_query       = []
  sql_attributes  = {}
  search_patterns = @tmp_params[:search].strip.gsub(/(?<=[\\s])\\s*|^\\s+|\\s+$/, '').downcase

  search_patterns_tmp = search_patterns.scan(/"(.*?)"/).flatten
  search_patterns     = search_patterns.gsub(/"(.*?)"/, '').split
  search_patterns << search_patterns_tmp

  search_patterns.flatten.each_with_index do |pattern, i|
    sql_subquery = []
    @searchable_attributes.each do |attribute|
      if attribute.is_a?(Hash)
        if attribute == :as
          attribute.each_value do |value|
            sql_subquery << "lower(CAST(#{value} AS TEXT)) LIKE :#{value}_#{i}"
            sql_attributes = sql_attributes.merge({ "#{value}_#{i}".to_sym => "%#{pattern}%" })
          end
        else
          key_name = attribute.keys.first.to_s.pluralize
          attribute.each_value do |value|
            sql_subquery << "lower(CAST(#{key_name}.#{value} AS TEXT)) LIKE :#{key_name}_#{value}_#{i}"
            sql_attributes = sql_attributes.merge({ "#{key_name}_#{value}_#{i}".to_sym => "%#{pattern}%" })
          end
        end
      else
        sql_subquery << "lower(CAST(#{to_s.underscore.pluralize.split('/').last}.#{attribute} AS TEXT)) LIKE :#{attribute}_#{i}"
        sql_attributes = sql_attributes.merge({ "#{attribute}_#{i}".to_sym => "%#{pattern}%" })
      end
    end
    sql_query << "(#{sql_subquery.join(' OR ')})"
  end

  sql.where([sql_query.join(' AND '), sql_attributes])
end
search_sort_paginate() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 156
def self.search_sort_paginate
  search
end
session_store() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 160
def self.session_store
  @session[store_id]
end
sorting?() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 110
def self.sorting?
  @tmp_params[:sort].nil? || @tmp_params[:direction].nil?
end
store_id() click to toggle source
# File lib/ui_bibz/concerns/models/searchable.rb, line 35
def self.store_id
  @arguments[:store_id] || @params[:controller]
end
table_search_pagination(params, session, args = {}) click to toggle source

Maybe create a class to put all methods of table_search_pagination

# File lib/ui_bibz/concerns/models/searchable.rb, line 8
def self.table_search_pagination(params, session, args = {})
  @params           = params.permit!
  @session          = session
  @arguments        = args

  initialize_params
  OpenStruct.new(generate_parameters)
end