scinote-web/app/models/concerns/searchable_model.rb

54 lines
1.5 KiB
Ruby
Raw Normal View History

2016-02-12 23:52:43 +08:00
module SearchableModel
extend ActiveSupport::Concern
included do
# Helper function for relations that
# adds OR ILIKE where clause for all specified attributes
# for the given search query
scope :where_attributes_like, ->(attributes, query) do
attrs = []
if attributes.blank? or query.blank?
# Do nothing in this case
elsif attributes.is_a? Symbol
attrs = [attributes.to_s]
elsif attributes.is_a? String
attrs = [attributes]
elsif attributes.is_a? Array
attrs = attributes.collect { |a| a.to_s }
else
raise ArgumentError, ":attributes must be an array, symbol or string"
end
2016-07-21 19:11:15 +08:00
if query.is_a? Array
2016-11-14 19:32:41 +08:00
2017-04-11 20:55:44 +08:00
unless attrs.empty?
2016-07-21 19:11:15 +08:00
where_str =
2016-11-11 18:41:23 +08:00
(attrs.map.with_index do |a, i|
2017-04-11 20:55:44 +08:00
"(trim_html_tags(#{a})) ILIKE ANY (array[ :t#{i}]) OR "
2016-11-11 18:41:23 +08:00
end
).join[0..-5]
2017-04-11 20:55:44 +08:00
vals = (attrs.map.with_index do |_, i|
2016-11-11 18:41:23 +08:00
["t#{i}".to_sym, query]
end
).to_h
2016-02-12 23:52:43 +08:00
2016-07-21 19:11:15 +08:00
return where(where_str, vals)
end
else
2017-04-11 20:55:44 +08:00
unless attrs.empty?
2016-07-21 19:11:15 +08:00
where_str =
2016-11-11 18:41:23 +08:00
(attrs.map.with_index do |a, i|
2017-04-11 20:55:44 +08:00
"(trim_html_tags(#{a})) ILIKE :t#{i} OR "
2016-11-11 18:41:23 +08:00
end
).join[0..-5]
2017-04-11 20:55:44 +08:00
vals = (attrs.map.with_index { |_, i| ["t#{i}".to_sym, query.to_s] })
.to_h
2016-07-21 19:11:15 +08:00
return where(where_str, vals)
end
2016-02-12 23:52:43 +08:00
end
end
end
2016-11-11 18:41:23 +08:00
end