diff --git a/app/controllers/api/v2/restful_controller.rb b/app/controllers/api/v2/restful_controller.rb
index 68d6a63f..d09f4cc0 100644
--- a/app/controllers/api/v2/restful_controller.rb
+++ b/app/controllers/api/v2/restful_controller.rb
@@ -150,10 +150,21 @@ module Api
# override this method to explicitly set searchable columns
def searchable_columns
+ return @searchable_columns unless @searchable_columns.nil?
+
columns = resource_class.columns.select do |column|
column.type == :text || column.type == :string
end
- columns.map(&:name)
+ @searchable_columns = columns.map(&:name)
+ end
+
+ # e.g. ?q=test&searchfields=name,desc
+ def searchfields
+ return searchable_columns if params[:searchfields].blank?
+
+ searchfields = params[:searchfields].split(',')
+ searchfields.select! { |f| searchable_columns.include?(f.to_sym) }
+ searchfields.empty? ? searchable_columns : searchfields
end
# thanks to http://stackoverflow.com/questions/4430578
@@ -162,7 +173,7 @@ module Api
safe_query = "%#{params[:q].gsub(/[%_]/, '\\\\\0')}%"
search_column = ->(column) { table[column].matches(safe_query) }
- condition = searchable_columns.reduce(nil) do |prev, column|
+ condition = searchfields.reduce(nil) do |prev, column|
next search_column.call(column) if prev.nil?
search_column.call(column).or(prev)
end
diff --git a/doc/api/traits/searchable.raml b/doc/api/traits/searchable.raml
index fb7700a9..83cfbfb4 100644
--- a/doc/api/traits/searchable.raml
+++ b/doc/api/traits/searchable.raml
@@ -4,3 +4,8 @@ queryParameters:
Search text columns for this string. A query of "example"
will be passed to SQL as LIKE %example%
. The searchable columns are:
<< searchFields >>required: false type: string + searchfields: + description: | + A comma-seperated list of columns to search. For instance, to search a topic's name and description (but not link field) for the string "cognition", you could use `?q=cognition&searchfields=name,desc`. + required: false + type: string