Module: ActiveRpc::Rpc::Concerns::Ransackable

Extended by:
ActiveSupport::Concern
Included in:
QueryBuilder
Defined in:
lib/active_rpc/rpc/concerns/ransackable.rb

Overview

The Ransackable concern provides methods for applying Ransack-based filtering to ActiveRecord queries in gRPC controllers.

It supports:

  • Standard Ransack predicates (e.g., q=John)

  • Full-text search via q=query

Examples:

def list_users
  process_request do
    base_query = User.all
    query = apply_ransack(base_query, request.message)
    # ...
  end
end

Instance Method Summary collapse

Instance Method Details

#apply_ransack(query, params) ⇒ Object

Apply Ransack search parameters to a query



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
# File 'lib/active_rpc/rpc/concerns/ransackable.rb', line 23

def apply_ransack(query, params)
  return query unless params.respond_to?(:q) && params.q.present?

  begin
    # Convert the map to a hash
    search_params = params.q.to_h

    # Get query configuration
    query_config = get_query_config(query.model)
    searchable_attrs = query_config[:searchable] || []

    # Filter out non-searchable attributes
    filtered_params = {}
    search_params.each do |key, value|
      # Extract the attribute name from the Ransack predicate
      attr_name = key.to_s.split('_').first

      # Include the parameter if the attribute is searchable
      if searchable_attrs.include?(attr_name.to_sym) || searchable_attrs.include?(attr_name.to_s) || searchable_attrs.empty?
        filtered_params[key] = value
      end
    end

    # Check for special search parameter
    if ActiveRpc::Rpc.configuration.enable_full_text_search &&
       filtered_params.key?('search') && filtered_params['search'].present?
      search_query = filtered_params.delete('search')
      query = apply_full_text_search(query, search_query)
    end

    # Apply standard Ransack filters
    query.ransack(filtered_params).result
  rescue => e
    Rails.logger.error("Error applying ransack: #{e.message}")
    # Return original query if ransack fails
    query
  end
end