Rails. Фильтруйте объекты Postgres по их массивам. ОШИБКА: неправильный массив литерала

Julius Dzidzevičius спросил: 13 октября 2017 в 06:08 в: ruby-on-rails

Не могу разобраться с фильтрацией массивов. Это:

@profiles = Profile.filter(params.slice(:location, :status, :items))

Пропускает записи для фильтрации:

def filter(filtering_params)
  results = self.where(nil)
  puts filtering_params  filtering_params.each do |key, value|
    if value.is_a?(Array)     
      results = results.public_send(key, value.to_s) if self.where("#{key}", value)
    else
      results = results.public_send(key, value) if value.present? 
    end
  end
  results
end

Но есть некоторые проблемы с Postgres Array. Параметры, передаваемые в метод filter:

Параметры: {"utf8" = >"✓","location" = >"0","status" = >"0","items" = > ["0","1"],"commit" = >"Filtruoti"}

и метод получает их:

{"location" = >"0","status" = >"0","items" = > ["0","1"]}

Но я получаю сообщение об ошибке:

PG :: InvalidTextRepresentation: ОШИБКА: неправильный литерал массива:"0" LINE 1: ..."= $ 2 И" profile"." items"IN ('0', '1') ... ^

DETAIL: значение массива должно начинаться с" {"или информации о размерах.: ВЫБРАТЬ" profile". FROM" profileers"WHERE" profile"." location"= $ 1 AND" анкеты"." status"= $ 2 AND" анкеты"." items"IN ('0', '1') LIMIT $ 3 OFFSET $ 4

И эта ошибка фактически указывает на то, где я хочу отобразить полученные записи:

<% rofiles.each do |profile| %>

Что происходит с этим массивом Postgres ..?

gem 'rails', '~> 5.0.3'
gem 'pg', '~> 0.18'

РЕДАКТИРОВАТЬ:

Похоже, что теперь работает хорошо с scop е:

scope :items, -> (items) { where "items && ARRAY[?]::integer[]", items } 

И

def filter(filtering_params)
  results = self.where(nil)  filtering_params.each do |key, value|
    puts value
    if value.is_a?(Array)     
      value = [0, 1, 2]
      results = results.public_send(key, value) if self.where("key && ARRAY[?]::integer[]", value)
    else
      results = results.public_send(key, value) if value.present? 
    end
  end
  results
end

0 ответов