Module: MakeModelSearchable

Defined in:
lib/make_model_searchable.rb,
lib/make_model_searchable/version.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

VERSION =
"0.3.0"

Instance Method Summary collapse

Instance Method Details

#get_valid_fields(options) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/make_model_searchable.rb', line 42

def get_valid_fields(options)
  column_names = self.columns.map(&:name)
  column_types = self.columns.map(&:type)
  searchable_columns = []
  if column_names.length == column_types.length
    column_names.each_with_index do |column_name, index|
      searchable_columns << column_name if column_types[index].to_sym == :string 
    end
  end
  if searchable_columns.present?
    valid_fields = options.select{ |option| searchable_columns.include?(option.to_s) }
  else
    valid_fields = []
  end
  valid_fields
end

#get_valid_joined_fields(key, columns_array) ⇒ Object



59
60
61
62
63
64
65
66
67
68
# File 'lib/make_model_searchable.rb', line 59

def get_valid_joined_fields(key, columns_array)
  associated_model = self.reflect_on_association(key).klass
  associated_model.connection
  if columns_array.empty?
    valid_joied_fields = associated_model.columns.select{ |col| col.type == :string or col.type == :text }
  else
    valid_joied_fields = associated_model.columns.select{ |col| (col.type == :string or col.type == :text) and columns_array.include?(col.name.to_sym) }
  end
  valid_joied_fields
end

#searchable_attributes(*options) ⇒ Object



7
8
9
10
11
12
13
14
15
16
# File 'lib/make_model_searchable.rb', line 7

def searchable_attributes(*options)
  # self.connection
  joined_options = options.select{ |option| option.is_a? (Hash) }
  options = options.select{ |option| !option.is_a?(Hash) }
  setup_fields(options)
  if joined_options.present?
    setup_joined_fields(joined_options)
  end
  self.extend(ClassMethods)
end

#setup_fields(options) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/make_model_searchable.rb', line 34

def setup_fields(options)
  unless options.present?
    options = self.column_names
  end
  valid_fields = get_valid_fields(options)
  self.instance_variable_set(:@selected_fields, valid_fields)
end

#setup_joined_fields(options_array) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/make_model_searchable.rb', line 18

def setup_joined_fields(options_array)
  joined_fields = []
  association_names = self.reflect_on_all_associations.map(&:name)
  valid_opts = options_array.first.select {|k,v| association_names.include?(k)  }
  searchable_fields = []

  valid_opts.each do |key, val|
    assoc =  self.reflect_on_association(key)
    joined_fields << get_valid_joined_fields(key, val)
    joined_fields.flatten.each do |f|
      searchable_fields << SearchableField.new(f.name, f.type, assoc.name,  assoc.klass)
    end
  end
  self.instance_variable_set(:@joined_fields, searchable_fields.flatten) if searchable_fields.present?
end