0

我在我的应用程序中使用了 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

有没有人遇到过并解决过这个问题?

4

2 回答 2

0

对于遇到此问题的其他任何人,您可以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

要阻止这种情况发生,只需运行 cucumber 和 rspec 而不使用 rake!

# run cucumber and rspec without rake
cucumber
rpsec

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

于 2013-07-02T16:52:14.527 回答
0

这里真正的解决方案是使用 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 中(我不确定这是否有必要,我懒得测试它)。

于 2014-11-19T06:10:23.633 回答