Ruby on rails 使用textacular和PG测试全文搜索::错误:错误:函数相似性(字符变化,未知)不存在

Ruby on rails 使用textacular和PG测试全文搜索::错误:错误:函数相似性(字符变化,未知)不存在,ruby-on-rails,postgresql,full-text-search,cucumber,Ruby On Rails,Postgresql,Full Text Search,Cucumber,我已经在我的应用程序中使用了文本语言,但我的功能正在崩溃。以下代码: 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

我已经在我的应用程序中使用了文本语言,但我的功能正在崩溃。以下代码:

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\u trigram
,但是如果您使用rake运行cucucumber或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
为了防止这种情况发生,只需运行cucumber和rspec而不使用rake

# 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(我不记得这是否必要,我也懒得测试它)。

您是否也在测试数据库中设置了
pg\u trgm
?是的,我正在成功运行
bundle exec rake textalual:install\u trigram
,然后运行我的功能。我仍然会遇到这个错误。但是这会将PostgreSQL扩展安装到您的测试数据库中吗?@muistooshort,问题是因为我运行了“rake cumber”而不是“cumber”。当您使用rake运行它时,您还可以运行db:setup,这将重置db并删除trigram。所以现在已经修好了,谢谢你的帮助。你可能想把它记下来作为一个答案,这似乎是一个很简单的错误,很多人都会犯。