0

我正在使用 Rails 运行 Postgres 版本 9.3.4.2。我迁移了数据库并tsvector从模型中删除了该列Post(并将其添加到Message)。现在,当我create尝试执行 Post 控制器的操作时,INSERT INTO "posts"我收到一条错误消息"tsvector column 'tsv_body' does not exist"。Schema 没有tsvector显示posts. 我已经重新启动了服务器和 Postgres。这是怎么回事?我想从技术上讲,错误消息是正确的 - 该tsvectortsv_body不存在!这不是故意的。但是为什么它首先要在模型中寻找一tsvector列呢?Post

编辑

好的,我在 Railscasts ep 的末尾找到了这个。343.我认为问题是由这段代码引起的:

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

显然,schema.rb当有 sql 迁移时,该文件是不完整的。所以现在的问题变成了:如何编写迁移来撤消这段代码?

4

2 回答 2

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
于 2017-12-19T15:58:12.350 回答
0

看起来 tsvector 是 postgres 中的一种数据类型,即列类型而不是列名,或者也与索引有关。如果您可以发布代码,人们可能会提供帮助。否则,可能会给你更多线索

于 2017-12-18T01:21:47.923 回答