Sha256: 4779dbddd7494731417b0011adc91ccf3288e21ed17276c3155d394e42e9fc21

Contents?: true

Size: 1.28 KB

Versions: 5

Compression:

Stored size: 1.28 KB

Contents

# Multi-field text searching on models.
class RESTFramework::ModelSearchFilter < RESTFramework::BaseFilter
  # Get a list of search fields for the current action.
  def _get_fields
    if search_fields = @controller.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

  # Filter data according to the request query parameters.
  def get_filtered_data(data)
    search = @controller.request.query_parameters[@controller.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.search_ilike ? "ILIKE" : "LIKE"} ?"
          }.join(" OR "),
          *(["%#{search}%"] * fields.length),
        )
      end
    end

    return data
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rest_framework-0.9.7 lib/rest_framework/filters/model_search.rb
rest_framework-0.9.6 lib/rest_framework/filters/model_search.rb
rest_framework-0.9.5 lib/rest_framework/filters/model_search.rb
rest_framework-0.9.4 lib/rest_framework/filters/model_search.rb
rest_framework-0.9.3 lib/rest_framework/filters/model_search.rb