module Pureapi::Model
Implement methods use for handle with table records like
-
Methods in as_json
2.
Constants
- COMPARISON_OPERATORS
- COMPARISON_OPERATORS_INVERT
- LOGICAL_OPERATORS
- LOGICAL_OPERATORS_INVERT
- NULL_OPERATORS
- NULL_OPERATOR_KEYS
- PERMIT_OPERATORS
- REFLECT_OPERATORS
Public Instance Methods
Search by params of relations
# File lib/pureapi/model.rb, line 301 def _include_search include_params criterias = self include_params.each do |entity, query| criterias = criterias.where(entity => of_entities[entity].compcond_search(query)) if of_entities[entity] end return criterias.where({}) end
Return all available values around model
# File lib/pureapi/model.rb, line 215 def _json_fields nested_entities = [] nested_entities << self { only: default_onlyasjsons, methods: json_methods, include: get_includes(nested_entities), } end
Return all fields can use for search of model
# File lib/pureapi/model.rb, line 267 def _search_fields _results = {only: compcond_columns, include: {}} of_entities.each do |entity, _c| _results[:include][entity] = _c._search_fields end _results end
Search by params of attributes of model
# File lib/pureapi/model.rb, line 283 def _self_search only_params criterias = self only_params.each do |filter| case filter[:o] when Operators::EQ[:id], Operators::IN[:id] criterias = criterias.where(filter[:f] => filter[:v]) when Operators::ISNIL[:id], Operators::ISNNIL[:id] criterias = criterias.where("`#{self.table_name}`.`#{filter[:f]}` #{REFLECT_OPERATORS[filter[:o]]}") else criterias = criterias.where("`#{self.table_name}`.`#{filter[:f]}` #{REFLECT_OPERATORS[filter[:o]]} ?", filter[:v]) end end return criterias.where({}) end
return criterias.where({})
end
# File lib/pureapi/model.rb, line 93 def advanced_search(advanced_params) return self.where({}) end
Static of _json_fields
# File lib/pureapi/model.rb, line 226 def as_json_fields @as_json_fields ||= self._json_fields end
Define default fields use for asjson on includes E.g {
channel: {only: [:id, :code, :name], include: Channel.asjson_fields}, course: {only: [:id, :code, :name]}
}
# File lib/pureapi/model.rb, line 175 def asjson_fields {} end
Define array of columns use for comparison conditions E.g [:id, :name, :channel_course_id, :status]
# File lib/pureapi/model.rb, line 153 def compcond_columns [:id] end
Static of _search_fields
# File lib/pureapi/model.rb, line 278 def compcond_fields @compcond_fields ||= self._search_fields end
Return matchs of key with compcond_regexp
|| compcond_regexp2nd
# File lib/pureapi/model.rb, line 253 def compcond_match(str) _matchs = compcond_regexp.match(str) || compcond_regexp2nd.match(str) if _matchs { f: _matchs[1], o: _matchs[2] ? _matchs[2].to_sym : :eq, } else nil end end
Full compcond regexp for key Example:
>> id.gte
# File lib/pureapi/model.rb, line 241 def compcond_regexp @compcond_regexp ||= /^(#{compcond_columns.join("|")})\.(#{REFLECT_OPERATORS.keys.join("|")})$/ end
Compcond regexp for key Example:
>> id
# File lib/pureapi/model.rb, line 248 def compcond_regexp2nd @compcond_regexp2nd ||= /^(#{compcond_columns.join("|")})$/ end
Collaborate _self_search
& _include_search
# File lib/pureapi/model.rb, line 312 def compcond_search params criterias = self criterias = criterias._self_search(params[:only]) if params[:only].is_a?(Array) criterias = criterias._include_search(params[:include]) if params[:include].is_a?(Hash) return criterias.where({}) end
Comparsion operator conditions method Array params
contains hash = {f, o, v} :f is column name :o is comparsion operator :v is value
# File lib/pureapi/model.rb, line 120 def compconds(params = []) criterias = self params.each do |param| if param[:o] == COMPARISON_OPERATORS[:eq] criterias = criterias.where(param[:f] => param[:v]) else criterias = criterias.where("`#{self.table_name}`.`#{param[:f]}` #{param[:o]} ?", param[:v]) end end return criterias.where({}) end
Define default includes of active records E.g [:channel, :course]
# File lib/pureapi/model.rb, line 165 def default_includes [] end
Define default fields use for as_jsons
# File lib/pureapi/model.rb, line 184 def default_onlyasjsons self.column_names.map(&:to_sym) end
Provide search function 2 type: normal and advanced Required setup advanced_search
methods
ActionController::Parameters _params
, contain fields use .where() ActionController::Parameters _advanced_params
, detail in advanced_search
method Or Hash _params
, contain fields use .where() Hash _advanced_params
, detail in advanced_search
method
# File lib/pureapi/model.rb, line 105 def full_search(params, advanced_params) _params = params.delete_if { |k, v| v.blank? } criterias = self criterias = _params.blank? ? criterias : criterias.where(_params.to_h) criterias = advanced_params.blank? ? criterias : criterias.advanced_search(advanced_params.to_h) return criterias.where({}) end
Get all includes of relations in model
# File lib/pureapi/model.rb, line 201 def get_includes nested_entities _results = {} _entities = include_entities (_entities.keys - nested_entities).each do |_c| _entities[_c].each do |_r| _results[_r] = _c._json_fields(nested_entities) end end _results end
Define relation entities can be included Example:
>> {User => [:manager], Department => [:department]}
# File lib/pureapi/model.rb, line 191 def include_entities {} end
Define array of columns use for in conditions (logical) E.g [:id, :name, :channel_course_id, :status]
# File lib/pureapi/model.rb, line 159 def incond_columns [:id] end
# File lib/pureapi/model.rb, line 179 def json_method_includes {} end
return default array contains methods for as_json Eg. [:status_name, :path_detail, :restrictions, :channel_course_code]
# File lib/pureapi/model.rb, line 66 def json_methods [] end
Comparsion operator conditions method Array params
contains hash = {f, o, v} :f is column name :o is comparsion operator :v is value
# File lib/pureapi/model.rb, line 139 def logicconds(params = []) criterias = self params.each do |param| if param[:o] == LOGICAL_OPERATORS[:in] criterias = criterias.where(param[:f] => param[:v]) end end return criterias.where({}) end
Begin methods for feature compconds filter
Return list of all belongs_to => class_name Example:
>> {ad: Ad, lead_level: LeadLevel, course: Course}
# File lib/pureapi/model.rb, line 234 def of_entities {} end
Require params is hash contain Integer :page, :per_page
# File lib/pureapi/model.rb, line 196 def paginate(params) self.limit(params[:per_page]).offset((params[:page] - 1) * params[:per_page]) end