- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Ruby on Rails 开发一个非常简单的博客,目前正在使用 pg_search 实现搜索功能以进行 PostgreSQL 全文搜索。不幸的是,我在更新 posts 表中的 tsvector 列时遇到了问题(我相信)。经过几个小时的搜索,我无法自己解决问题 - 尽管我怀疑如果您以前做过类似的事情会很容易。
无论如何,错误内容如下:
irb(main):001:0> post = FactoryGirl.build :post
=> #<Post id: nil, title: "Optimized uniform infrastructure", body: "<p>Inventore consectetur culpa nulla eius voluptati...", published: true, created_at: "2012-09-09 04:08:51", updated_at: nil, tsv: nil>
irb(main):002:0> post.save
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "tsv" does not exist
LINE 1: SELECT tsvector_update_trigger(tsv, 'pg_catalog.english', ti...
QUERY: SELECT tsvector_update_trigger(tsv, 'pg_catalog.english', title, body)
CONTEXT: PL/pgSQL function "posts_before_insert_update_row_tr" line 3 at assignment
: INSERT INTO "posts" ("body", "created_at", "published", "title", "updated_at") VALUES
($1, $2, $3, $4, $5) RETURNING "id"
tsv 列是在这样的迁移中创建的:
class AddTsvToPosts < ActiveRecord::Migration
def change
add_column :posts, :tsv, :tsvector
add_index(:posts, :tsv, using: 'gin')
end
end
触发器是使用 hair_trigger 定义的这样:
class Post < ActiveRecord::Base
include PgSearch
pg_search_scope :search, against: [:title, :body],
using: {
tsearch: {
dictionary: 'english',
prefix: true,
tsvector_column: 'tsv'
}
}
trigger.before(:insert, :update) do
"new.tsv := tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);"
end
end
整个过程产生以下 sql 模式(使用 config.active_record.schema_format = :sql
)-- -- PostgreSQL 数据库转储 --
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
--
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
--
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
SET search_path = public, pg_catalog;
--
-- Name: posts_before_insert_update_row_tr(); Type: FUNCTION; Schema: public; Owner: -
--
CREATE FUNCTION posts_before_insert_update_row_tr() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
new.tsv := tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
RETURN NEW;
END;
$$;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: posts; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE posts (
id integer NOT NULL,
title character varying(255),
body text,
published boolean,
created_at timestamp without time zone,
updated_at timestamp without time zone,
tsv tsvector
);
--
-- Name: posts_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE posts_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: posts_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE posts_id_seq OWNED BY posts.id;
--
-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE schema_migrations (
version character varying(255) NOT NULL
);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY posts ALTER COLUMN id SET DEFAULT nextval('posts_id_seq'::regclass);
--
-- Name: posts_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY posts
ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
--
-- Name: index_posts_on_tsv; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_posts_on_tsv ON posts USING gin (tsv);
--
-- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations USING btree (version);
--
-- Name: posts_before_insert_update_row_tr; Type: TRIGGER; Schema: public; Owner: -
--
CREATE TRIGGER posts_before_insert_update_row_tr BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE posts_before_insert_update_row_tr();
--
-- PostgreSQL database dump complete
--
SET search_path TO "$user",public;
INSERT INTO schema_migrations (version) VALUES ('20131230213035');
INSERT INTO schema_migrations (version) VALUES ('20140115101632');
INSERT INTO schema_migrations (version) VALUES ('20140115183846');
如果有人能帮我弄清楚为什么 rails 不承认 tsv 列的存在,我会soooooo 高兴! :)
最佳答案
If someone could help me to figure out on why rails doesn't acknowledges the existance of the tsv column
这不是 rails,而是这段代码:
new.tsv := tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
除了无法解释此上下文中的 tsv
的句法问题外,真正令人担忧的是 tsvector_update_trigger
返回 trigger
,而不是 tsvector
,因此它应该由 SQL 引擎在插入或更新后调用,而不是由用户代码显式调用。
事实上,之所以使用预先存在的 tsvector_update_trigger
正是为了让程序员避免首先编写触发器。您应该使用 CREATE TRIGGER
语句直接引用它,如下所示:
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
然后您的函数 posts_before_insert_update_row_tr()
就不需要了。
参见 Triggers for Automatic Updates在文档中。
关于sql - tsvector_update_trigger 找不到 tsvector 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21147893/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!