application_record.rb
1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
self.store_full_sti_class = true
# an ActionView instance for rendering views on models
def self.action_view
@action_view ||= begin
view_paths = ::ActionController::Base.view_paths
action_view = ::ActionView::Base.new view_paths
# for using Noosfero helpers inside render calls
action_view.extend ::ApplicationHelper
action_view
end
end
# default value needed for the above ActionView
def to_partial_path
self.class.name.underscore
end
alias :meta_cache_key :cache_key
def cache_key
key = [Noosfero::VERSION, meta_cache_key]
key.unshift ApplicationRecord.connection.schema_search_path
key.join('/')
end
def self.like_search(query, options={})
if defined?(self::SEARCHABLE_FIELDS) || options[:fields].present?
fields_per_table = {}
fields_per_table[table_name] = (options[:fields].present? ? options[:fields] : self::SEARCHABLE_FIELDS.keys.map(&:to_s)) & column_names
if options[:joins].present?
join_asset = options[:joins].to_s.classify.constantize
if defined?(join_asset::SEARCHABLE_FIELDS) || options[:fields].present?
fields_per_table[join_asset.table_name] = (options[:fields].present? ? options[:fields] : join_asset::SEARCHABLE_FIELDS.keys.map(&:to_s)) & join_asset.column_names
end
end
query = query.downcase.strip
fields_per_table.delete_if { |table,fields| fields.blank? }
conditions = fields_per_table.map do |table,fields|
fields.map do |field|
"lower(#{table}.#{field}) LIKE '%#{query}%'"
end.join(' OR ')
end.join(' OR ')
if options[:joins].present?
joins(options[:joins]).where(conditions)
else
where(conditions)
end
else
raise "No searchable fields defined for #{self.name}"
end
end
end