module Discerner::Methods::Models::SearchParameter
Public Class Methods
included(base)
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 5 def self.included(base) base.send :include, SoftDelete base.send :include, Warning # Associations base.send :belongs_to, :search, inverse_of: :search_parameters base.send :belongs_to, :parameter, inverse_of: :search_parameters base.send :has_many, :search_parameter_values, dependent: :destroy, inverse_of: :search_parameter # Scopes base.send(:scope, :by_parameter_category, ->(parameter_category) { base.includes(:parameter).where('discerner_parameters.parameter_category_id' => parameter_category.id) unless parameter_category.blank?}) base.send(:scope, :ordered_by_display_order, -> { base.order('discerner_search_parameters.display_order ASC') }) base.send(:scope, :ordered, -> { base.order('discerner_search_parameters.id ASC') }) #Validations base.send :validates_presence_of, :search, :parameter # Nested attributes base.send :accepts_nested_attributes_for, :search_parameter_values, allow_destroy: true # Hooks base.send :after_commit, :update_associations, on: :update, if: Proc.new { |record| record.previous_changes.include?('deleted_at') } base.send :after_commit, :mark_search_updated end
new(*args)
click to toggle source
Instance Methods
Calls superclass method
# File lib/discerner/methods/models/search_parameter.rb, line 31 def initialize(*args) super(*args) end
Public Instance Methods
check_search_parameters()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 35 def check_search_parameters if self.search_parameters.size < 1 || self.search_parameters.all?{|search_parameter| search_parameter.marked_for_destruction? } errors.add(:base,"Search should have at least one search criteria.") end end
disabled?()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 100 def disabled? return false unless persisted? if parameter.blank? warnings.add(:base, "Parameter has to be selected") return true elsif parameter.deleted? warnings.add(:base, "Parameter has been deleted and has to be removed from the search") return true elsif search_parameter_values.blank? || (parameter.parameter_type.name == 'list' && search_parameter_values.select{|spv| spv.chosen?}.empty?) warnings.add(:base, "Parameter value has to be selected") return true elsif deleted? || search_parameter_values.select{ |spv| spv.disabled?}.any? return true end end
parameterized_name()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 41 def parameterized_name name.blank? ? 'no_name_specified' : name.parameterize.underscore end
prepare_sql()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 45 def prepare_sql sql = {} parameter_type = parameter.parameter_type.name case parameter_type when 'list' values = [search_parameter_values.chosen.map { |spv| spv.parameter_value.search_value }] predicate = "#{parameter.search_method} in (?)" when 'combobox' values = [search_parameter_values.map { |spv| spv.parameter_value.search_value unless spv.parameter_value.nil? }.compact] predicate = "#{parameter.search_method} in (?)" unless values.blank? when 'exclusive_list' values = [search_parameter_values.map { |spv| spv.parameter_value.search_value unless spv.parameter_value.nil? }.compact.first] predicate = "#{parameter.search_method} = ?" unless values.blank? else # 'numeric','date', 'text', 'string spvs = [] values = [] search_parameter_values.map {|spv| spvs << spv.to_sql} predicates = spvs.map { |s| s[:predicates] }.join(' or ') predicate = "(#{predicates})" spvs.each do |spv| if spv[:values].is_a?(Array) spv[:values].each do |v| values << v end else values << spv[:values] unless spv[:values].blank? end end end sql[:predicates] = predicate sql[:values] = values sql end
search_model_attribute_method?()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 88 def search_model_attribute_method? search_model_class && search_model_class.attribute_method?(parameter.search_method) end
search_model_class()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 81 def search_model_class return if parameter.search_model.blank? || parameter.search_method.blank? search_model_class = parameter.search_model.safe_constantize raise "Search model #{parameter.search_model} could not be found" if search_model_class.blank? search_model_class end
to_sql()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 92 def to_sql sql = prepare_sql if search_model_class && !search_model_attribute_method? && search_model_class.respond_to?(parameter.search_method) sql = search_model_class.send(parameter.search_method, sql) end sql end
Private Instance Methods
mark_search_updated()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 124 def mark_search_updated if (self.destroyed? || !previous_changes.empty?) && search search.updated_at = Time.now search.save! end end
update_associations()
click to toggle source
# File lib/discerner/methods/models/search_parameter.rb, line 117 def update_associations search_parameter_values.each do |r| r.deleted_at = Time.now r.save end end