我的应用程序中有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(我记不清这是否有必要,也懒得测试它)。