Class: RESTFramework::ModelSearchFilter
- Inherits:
-
BaseFilter
- Object
- BaseFilter
- RESTFramework::ModelSearchFilter
- Defined in:
- lib/rest_framework/filters.rb
Overview
Multi-field text searching on models.
Instance Method Summary collapse
-
#_get_fields ⇒ Object
Get a list of search fields for the current action.
-
#get_filtered_data(data) ⇒ Object
Filter data according to the request query parameters.
Methods inherited from BaseFilter
Constructor Details
This class inherits a constructor from RESTFramework::BaseFilter
Instance Method Details
#_get_fields ⇒ Object
Get a list of search fields for the current action.
116 117 118 119 120 121 122 123 124 125 |
# File 'lib/rest_framework/filters.rb', line 116 def _get_fields if search_fields = @controller.class.search_fields return search_fields&.map(&:to_s) end columns = @controller.class.get_model.column_names return @controller.get_fields.select { |f| f.in?(RESTFramework.config.search_columns) && f.in?(columns) } end |
#get_filtered_data(data) ⇒ Object
Filter data according to the request query parameters.
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/rest_framework/filters.rb', line 128 def get_filtered_data(data) search = @controller.request.query_parameters[@controller.class.search_query_param] if search.present? if fields = self._get_fields.presence # MySQL doesn't support casting to VARCHAR, so we need to use CHAR instead. data_type = if data.connection.adapter_name =~ /mysql/i "CHAR" else # Sufficient for both PostgreSQL and SQLite. "VARCHAR" end # Ensure we pass user input as arguments to prevent SQL injection. return data.where( fields.map { |f| "CAST(#{f} AS #{data_type}) #{@controller.class.search_ilike ? "ILIKE" : "LIKE"} ?" }.join(" OR "), *(["%#{search}%"] * fields.length), ) end end return data end |