使用textacular和cucumber测试全文搜索抛出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)

我在Postgres中安装了Trigram模块,因为我使用的是模糊搜索,在开发中一切都很好。我不完全理解这个错误消息的含义。下面是我的代码:

# 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

以前有人遇到并解决过这个问题吗?

对于遇到此问题的其他人,您可以随心所欲地运行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

为了防止这种情况发生,只需在没有rake的情况下运行cucumber和rsspec!

# run cucumber and rspec without rake
cucumber
rpsec

多么可怕的问题!2天修复等…

这里真正的解决方案是使用SQL而不是Active Record的数据库模式文件的模式转储程序。因此,您应该有一个db/structure.sql文件,而不是db/schema.rb文件。您可以通过在config/application.rb文件中取消注释以下行来完成此操作:

config.active_record.schema_format = :sql

现在的情况是,每次运行测试时,都会删除并重新创建测试数据库。但它是使用db/schema.rb文件重新创建的,该文件不包含任何关于您安装的PostgreSQL扩展的信息,因为它是数据库无关的。为了在重新创建测试数据库时重新安装Postgres扩展,您需要SQL格式的架构。

此外,为了避免将来出现混淆,您可能需要在进行此切换后删除db/schema.rb文件。您可能需要回滚,然后运行迁移以将模式转储到SQL(我记不清这是否有必要,也懒得测试它)。

最新更新