Тестирование полнотекстового поиска с помощью текстовых и огуречных бросков 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 (я не могу точно вспомнить, если это необходимо, и мне лень это проверять).