Тестирование полнотекстового поиска с помощью текстовых и огуречных бросков PG:: Ошибка: ОШИБКА: подобия функции (символ изменяется, неизвестно) не существует

У меня в приложении работает textacular, но мои функции взрываются. Следующий код:

Background:
  Given the following "project" records:
    | name      |
    | Project 1 |
    | Project 2 |
  And I am on "the projects page"

Scenario: Find projects by content
  When I search for "Project 1"
  Then I should see the project called "Project 1" in the project list

Взрывается с этим сообщением:

When I search for "Project 1" # features/step_definitions/search_steps.rb:11

  PG::Error: ERROR:  function similarity(character varying, unknown) does not exist
  LINE 1: SELECT "projects".*, similarity("projects"."name", 'Project\...

  HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
  : SELECT "projects".*, similarity("projects"."name", 'Project\ 1') AS "rank79552331411843676" FROM "projects"  WHERE (("projects"."name" % 'Project\ 1'))  ORDER BY "rank79552331411843676" DESC (ActionView::Template::Error)

У меня установлен модуль Trigram в Postgres, так как я использую нечеткий поиск, и все отлично работает в разработке. Я не совсем понимаю, что означает это сообщение об ошибке. Вот немного больше моего кода:

# search_steps.rb
When(/^I search for "(.*?)"$/) do |query|
  fill_in 'query', with: query
  click_button 'Search'
end

# GET /projects
def index
  @projects = Project.search(params[:query])
end

# project.rb
def self.search(query)
  return all unless query.present?
  fuzzy_search(query)
end

Кто-нибудь сталкивался и исправлял это раньше?

2 ответа

Решение

Для тех, кто сталкивается с этой проблемой, вы можете запустить bundle exec rake textacular:install_trigram все, что вам нравится, но если вы используете rake для запуска cucumber или rspec, то вызывается db:test:prepare, а поскольку trigram не устанавливается через миграцию, это приводит к стиранию его с базы данных при загрузке схемы!

# install trigram in test db
bundle exec rake textacular:install_trigram RAILS_ENV=test

# wipe trigram from db
rake cucumber
rake rspec

Чтобы этого не случилось, просто запустите огурец и rspec без граблей!

# run cucumber and rspec without rake
cucumber
rpsec

Какая ужасная проблема! 2 дня, чтобы исправить и т.д...

Реальным решением здесь является использование SQL вместо дампера схемы Active Record для файла схемы базы данных. Итак, вместо db/schema.rb файл, вы должны иметь db/structure.sql файл. Вы можете сделать это, раскомментировав следующую строку в вашем config/application.rb файл:

config.active_record.schema_format = :sql

Что происходит, так это то, что ваша тестовая база данных удаляется и воссоздается при каждом запуске тестов. Но это воссоздано с помощью вашего db/schema.rb файл, который не содержит никакой информации о установленных вами расширениях PostgreSQL, поскольку он не зависит от базы данных. Чтобы переустановить ваши расширения Postgres при воссоздании тестовой базы данных, вам нужна схема в формате SQL.

Кроме того, чтобы избежать путаницы в будущем, вы можете удалить db/schema.rb файл после того, как вы сделаете этот переключатель. И вам может понадобиться выполнить откат, а затем запустить миграцию, чтобы получить схему, выгружаемую в SQL (я не могу точно вспомнить, если это необходимо, и мне лень это проверять).

Другие вопросы по тегам