Rails 5, Postgres, ActiveRecord - как включить значение функции в качестве поля модели

Я использую модуль Trigram (pg_trgm) для Postgres в приложении Rails 5 для текстового поиска. Мне удалось успешно получить удовлетворительные результаты, используя следующий вызов, чтобы найти limit количество записей, имена которых похожи на запрос:

  def self.glance(query, limit = 10)
    find_by_sql(['select *, name <-> ? as confidence from studies order by confidence limit ?', query, limit])
  end

Теперь я хотел бы расширить результаты, включив в них значение функции подобия для каждой записи и целевой запрос для отображения.

Я считаю, что мне следует настроить область (или метод класса), где я могу сделать параметризованный вызов оператора расстояния (имя ‹-> ?), а затем вернуть значение, как если бы это был атрибут в модели базы данных.

Могу ли я получить рекомендацию по лучшей практике для этого? Спасибо.


person Michael Morgan    schedule 02.09.2018    source источник


Ответы (1)


Если вы используете модель study, я подумал, что вы можете использовать область действия, и LIKE реализовал следующее:

scope :glance, ->(query, limit = 10) { where('name LIKE %?%', query).order(:confidence).limit(limit) }
person Hanh D.TRAN    schedule 04.09.2018
comment
Спасибо за предложение. Я попробовал это, но получил синтаксическую ошибку (хотя я уверен, что это испортил). Но на самом деле я пытаюсь использовать функцию pg_trgm '‹-›' не LIKE. В итоге я использовал ILIKE, но пытался заставить работать расширение поиска для триграмм. Вот синтаксическая ошибка: PG::SyntaxError: ОШИБКА: синтаксическая ошибка в или около % LINE 1: SELECT 1 AS one FROM Studies WHERE (name LIKE %'drone'%) ... - person Michael Morgan; 05.09.2018
comment
Необработанный SQL должен быть SELECT 1 AS one FROM "studies" WHERE (name LIKE %drone%)... не включен '. Итак, вы можете изменить что-то вроде ..where('name LIKE ?', "%#{query}%")... - person Hanh D.TRAN; 06.09.2018
comment
Я ценю все ссылки на использование LIKE, но я использую триграмму (pg_trgm) и оператор расстояния ‹-›, и это то, что я пытаюсь понять. - person Michael Morgan; 09.09.2018