ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: operator does not exist: text % unknown
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: operator does not exist: text % unknown
我正在尝试使用 pg_search 的函数 :trigram 来查找与我存储在数据库中的名称相似的名称。不幸的是,由于我还在学习 SQL,这个错误对我来说有点太多了,现在无法处理。
我的卡片型号:
class Card < ApplicationRecord
include PgSearch
pg_search_scope :spelled_like,
:against => :name,
:using => :trigram
end
我在 rails C:
中尝试做的事情
2.4.1 :005 > c = "Timeslream Navigator"
=> "Timeslream Navigator"
2.4.1 :006 > Card.spelled_like(c)
Card Load (1.9ms) SELECT "cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("cards"."name"::text, ''))), (to_tsquery('simple', ''' ' || 'Timeslream' || ' ''') && to_tsquery('simple', ''' ' || 'Navigator' || ' ''')), 0)) AS rank FROM "cards" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslream Navigator'))) AS pg_search_6ac9a32c0ca8e84e5bf0c3 ON "cards"."id" = pg_search_6ac9a32c0ca8e84e5bf0c3.pg_search_id ORDER BY pg_search_6ac9a32c0ca8e84e5bf0c3.rank DESC, "cards"."id" ASC LIMIT [["LIMIT", 11]]
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: operator does not exist: text % unknown
LINE 1: ...rds" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslr...
澄清 - 答案应该是 TimesTReam Navigator(它确实存在于我的数据库中)
Postgres 给了我一个提示:
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("cards"."name"::text, ''))), (to_tsquery('simple', ''' ' || 'Timeslream' || ' ''') && to_tsquery('simple', ''' ' || 'Navigator' || ' ''')), 0)) AS rank FROM "cards" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslream Navigator'))) AS pg_search_6ac9a32c0ca8e84e5bf0c3 ON "cards"."id" = pg_search_6ac9a32c0ca8e84e5bf0c3.pg_search_id ORDER BY pg_search_6ac9a32c0ca8e84e5bf0c3.rank DESC, "cards"."id" ASC LIMIT
但是,当我尝试调用它时,出现了另一个错误,此时并没有告诉我太多信息:
SyntaxError: (irb):7: syntax error, unexpected tCONSTANT, expecting end-of-input
"cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS
^
卡片架构:
ActiveRecord::Schema.define(version: 2018_05_31_102526) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
enable_extension "pg_trgm"
create_table "cards", force: :cascade do |t|
t.string "name"
t.string "set"
t.float "price"
t.string "image"
t.string "type_line"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
有什么想法吗?
回答我自己的问题:
- pg_search is awesome!
- 为了使用三元函数,你显然必须安装它。
- 我的问题是,我直接将它安装在 psql 中,但没有 运行 在我的 Rails 应用程序中进行适当的迁移。
这是让我解决问题并开始享受 trigram 惊人功能的迁移片段:
class InstallPgTrgmContribPackage < ActiveRecord::Migration[5.2]
def up
execute "CREATE EXTENSION pg_trgm;"
end
def down
execute "DROP EXTENSION pg_trgm;"
end
end
我的问题有点不同。即使我的扩展已经安装,我也会在 AWS 环境中收到此错误,但在较低的环境中不会。所以我删除了扩展并重新创建了它。
成功了。这是我的错误:
PG::UndefinedFunction: ERROR: operator does not exist: unknown <%
text Caused by the pg_search gem using trigrams.
或者你可以禁用三元组,但我想保留它们,所以我一直在研究
我正在尝试使用 pg_search 的函数 :trigram 来查找与我存储在数据库中的名称相似的名称。不幸的是,由于我还在学习 SQL,这个错误对我来说有点太多了,现在无法处理。
我的卡片型号:
class Card < ApplicationRecord
include PgSearch
pg_search_scope :spelled_like,
:against => :name,
:using => :trigram
end
我在 rails C:
中尝试做的事情2.4.1 :005 > c = "Timeslream Navigator"
=> "Timeslream Navigator"
2.4.1 :006 > Card.spelled_like(c)
Card Load (1.9ms) SELECT "cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("cards"."name"::text, ''))), (to_tsquery('simple', ''' ' || 'Timeslream' || ' ''') && to_tsquery('simple', ''' ' || 'Navigator' || ' ''')), 0)) AS rank FROM "cards" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslream Navigator'))) AS pg_search_6ac9a32c0ca8e84e5bf0c3 ON "cards"."id" = pg_search_6ac9a32c0ca8e84e5bf0c3.pg_search_id ORDER BY pg_search_6ac9a32c0ca8e84e5bf0c3.rank DESC, "cards"."id" ASC LIMIT [["LIMIT", 11]]
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: operator does not exist: text % unknown
LINE 1: ...rds" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslr...
澄清 - 答案应该是 TimesTReam Navigator(它确实存在于我的数据库中)
Postgres 给了我一个提示:
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("cards"."name"::text, ''))), (to_tsquery('simple', ''' ' || 'Timeslream' || ' ''') && to_tsquery('simple', ''' ' || 'Navigator' || ' ''')), 0)) AS rank FROM "cards" WHERE (((coalesce("cards"."name"::text, '')) % 'Timeslream Navigator'))) AS pg_search_6ac9a32c0ca8e84e5bf0c3 ON "cards"."id" = pg_search_6ac9a32c0ca8e84e5bf0c3.pg_search_id ORDER BY pg_search_6ac9a32c0ca8e84e5bf0c3.rank DESC, "cards"."id" ASC LIMIT
但是,当我尝试调用它时,出现了另一个错误,此时并没有告诉我太多信息:
SyntaxError: (irb):7: syntax error, unexpected tCONSTANT, expecting end-of-input
"cards".* FROM "cards" INNER JOIN (SELECT "cards"."id" AS
^
卡片架构:
ActiveRecord::Schema.define(version: 2018_05_31_102526) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
enable_extension "pg_trgm"
create_table "cards", force: :cascade do |t|
t.string "name"
t.string "set"
t.float "price"
t.string "image"
t.string "type_line"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
有什么想法吗?
回答我自己的问题:
- pg_search is awesome!
- 为了使用三元函数,你显然必须安装它。
- 我的问题是,我直接将它安装在 psql 中,但没有 运行 在我的 Rails 应用程序中进行适当的迁移。
这是让我解决问题并开始享受 trigram 惊人功能的迁移片段:
class InstallPgTrgmContribPackage < ActiveRecord::Migration[5.2]
def up
execute "CREATE EXTENSION pg_trgm;"
end
def down
execute "DROP EXTENSION pg_trgm;"
end
end
我的问题有点不同。即使我的扩展已经安装,我也会在 AWS 环境中收到此错误,但在较低的环境中不会。所以我删除了扩展并重新创建了它。
成功了。这是我的错误:
PG::UndefinedFunction: ERROR: operator does not exist: unknown <% text Caused by the pg_search gem using trigrams.
或者你可以禁用三元组,但我想保留它们,所以我一直在研究