Module: Discerner::Methods::Models::SearchParameter

Included in:
SearchParameter
Defined in:
lib/discerner/methods/models/search_parameter.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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

Instance Method Details

#check_search_parametersObject



35
36
37
38
39
# 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?Boolean

Returns:

  • (Boolean)


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/discerner/methods/models/search_parameter.rb', line 98

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

#initialize(*args) ⇒ Object

Instance Methods



31
32
33
# File 'lib/discerner/methods/models/search_parameter.rb', line 31

def initialize(*args)
  super(*args)
end

#parameterized_nameObject



41
42
43
# File 'lib/discerner/methods/models/search_parameter.rb', line 41

def parameterized_name
  name.blank? ? 'no_name_specified' : name.parameterize.underscore
end

#prepare_sqlObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 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?
  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?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/discerner/methods/models/search_parameter.rb', line 85

def search_model_attribute_method?
  search_model_class && search_model_class.attribute_method?(parameter.search_method)
end

#search_model_classObject



78
79
80
81
82
83
# File 'lib/discerner/methods/models/search_parameter.rb', line 78

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_sqlObject



89
90
91
92
93
94
95
96
# File 'lib/discerner/methods/models/search_parameter.rb', line 89

def to_sql
  sql = prepare_sql
  if search_model_class && !search_model_attribute_method?
    raise "Search model #{parameter.search_model} does not respond to search method #{parameter.search_method}" unless search_model_class.respond_to?(parameter.search_method)
    sql = search_model_class.send(parameter.search_method, sql)
  end
  sql
end