我正在使用Rails运行Postgres版本9.3.4.2。我迁移了数据库并从模型tsvector
中删除了Post
列(并将其添加到Message
)。现在当我点击Post控制器的create
操作并尝试INSERT INTO "posts"
时,我收到错误"tsvector column 'tsv_body' does not exist"
。架构显示tsvector
没有posts
列。我重新启动了服务器和Postgres。发生了什么事?我认为从技术上讲,错误信息是正确的 - tsvector
列tsv_body
不存在!这并不意味着。但是,为什么它首先在tsvector
模型中寻找Post
列?
修改
好的,我在Railscasts ep结束时发现了这个。我认为问题是由这段代码引起的:
class AddTsvectorSearchToPosts < ActiveRecord::Migration[5.1]
def change
# Adds a tsvector column for the body
add_column :posts, :tsv_body, :tsvector
# Adds an index for this new column
execute <<-SQL
CREATE INDEX index_posts_tsv_body ON posts USING gin(tsv_body);
SQL
# Updates existing rows so this new column gets calculated
execute <<-SQL
UPDATE posts SET tsv_body = (to_tsvector('english', coalesce(content, '')));
SQL
# Sets up a trigger to update this new column on inserts and updates
execute <<-SQL
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON posts FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv_body, 'pg_catalog.english', content);
SQL
end
end
当有sql迁移时,显然schema.rb
文件不完整。所以问题现在变成:如何编写迁移以撤消此代码?
答案 0 :(得分:0)
看起来tsvector是postgres中的一种数据,即列类型而不是列名,或者也与索引有关。如果您可以发布您的代码,那么人们可能会提供帮助。否则,this可能会给你更多线索
答案 1 :(得分:0)
是的,架构文件不完整。原来在structure.sql中显示正确的数据库结构。确实在那里,CREATE TRIGGER
表上有Post
个代码。此迁移修复了它:
def change
execute <<-SQL
DROP INDEX IF EXISTS index_posts_tsv_body;
DROP TRIGGER IF EXISTS tsvectorpostupdate ON posts;
SQL
end