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
- #check_search_parameters ⇒ Object
- #disabled? ⇒ Boolean
-
#initialize(*args) ⇒ Object
Instance Methods.
- #parameterized_name ⇒ Object
- #prepare_sql ⇒ Object
- #search_model_attribute_method? ⇒ Boolean
- #search_model_class ⇒ Object
- #to_sql ⇒ Object
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_parameters ⇒ Object
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
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_name ⇒ Object
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_sql ⇒ Object
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
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_class ⇒ Object
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_sql ⇒ Object
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 |