module MemberFilter extend ActiveSupport::Concern def filtered_members members = Member.all.order(sort_params.merge(number: :asc)) filters = params.permit(:prefers_postal, :display_name, :email, :identification_number, status: [], category: []) Rails.logger.info filters status = filters.fetch(:status, []) - ['any', ''] category = filters.fetch(:category, []) - ['any', ''] members = members.where(prefers_postal: true) if filters[:prefers_postal] == 'yes' members = members.where(prefers_postal: false) if filters[:prefers_postal] == 'no' members = members.where(status: status) if status != [] members = members.where(category: category) if category != [] members.ransack( display_name_i_cont: filters[:display_name], email_i_cont: filters[:email], identification_number_i_cont: filters[:identification_number], ).result end def sort_params field, direction = params.fetch(:sort, "").split(".") directions = %w[ asc desc ] fields = %w[ number expires_on joined_on email status display_name ] if directions.include?(direction) && fields.include?(field) { field => direction } else { number: :asc } end end end