summaryrefslogtreecommitdiff
path: root/app/finders/concerns/custom_attributes_filter.rb
blob: 825c3a6b5b71bae7a17cd97fe8d88ba8e1949d2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# frozen_string_literal: true

module CustomAttributesFilter
  # rubocop: disable CodeReuse/ActiveRecord
  def by_custom_attributes(items)
    return items unless params[:custom_attributes].is_a?(Hash)
    return items unless Ability.allowed?(current_user, :read_custom_attribute)

    association = items.reflect_on_association(:custom_attributes)
    attributes_table = association.klass.arel_table
    attributable_table = items.model.arel_table

    custom_attributes = association.klass.select('true').where(
      attributes_table[association.foreign_key]
        .eq(attributable_table[association.association_primary_key])
    )

    # perform a subquery for each attribute to be filtered
    params[:custom_attributes].inject(items) do |scope, (key, value)|
      scope.where('EXISTS (?)', custom_attributes.where(key: key, value: value))
    end
  end
  # rubocop: enable CodeReuse/ActiveRecord
end