ActiveRecord迁移不填充Postgres物化视图

sty*_*972 11 ruby postgresql activerecord ruby-on-rails materialized-views

我有一个MATERIALIZED VIEW通过迁移创建的.

class MyView < ActiveRecord::Migration
  def up
    ActiveRecord::Base.connection.execute <<-SQL
    CREATE MATERIALIZED VIEW my_view AS (
      SELECT DISTINCT something, something_else, other.thing as real_thing, thing.some_id
          FROM some_table
          JOIN another_table on another_table.id = something
          JOIN one_more_table on some_table.id = other_id
          ORDER BY order_column)
      WITH DATA;
    SQL

    add_index :table, [:key_part_one, :key_part_two]
  end

  ...
end
Run Code Online (Sandbox Code Playgroud)

注意:我已经混淆了SELECT语句,只要相信我它的工作原理.

这里要注意的重要部分是我已经明确调用WITH DATA,因此应该立即填充和扫描视图.

这不会发生.迁移运行,如下所示

==  MyView: migrating ========================
==  MyView: migrated (0.0763s) ===============
Run Code Online (Sandbox Code Playgroud)

稍后db:refresh我们会看到以下内容

Reindexing Something...
Reindex queued
Reindexing Another...
Reindex queued
Reindexing SomeOtherThing...
Reindex queued
Reindexing One::OtherThing...
Reindex queued
Reindexing MyViewModel...
rake aborted!
ActiveRecord::StatementInvalid: PG::ObjectNotInPrerequisiteState: ERROR:  materialized view "my_view" has not been populated
HINT:  Use the REFRESH MATERIALIZED VIEW command.
Run Code Online (Sandbox Code Playgroud)

嗯什么?我宣布了WITH DATA.我还有另一个REFRESH MATERIALIZED VIEW在视图上显式调用命令的连续迁移.

无济于事,为了完成rake db:refresh任务,我必须进入并手动刷新视图.

有趣的是,在structure.sql文件中,它显示为正在创建WITH NO DATA

CREATE MATERIALIZED VIEW my_view AS (
  SELECT DISTINCT something, something_else, other.thing as real_thing, thing.some_id
      FROM some_table
      JOIN another_table on another_table.id = something
      JOIN one_more_table on some_table.id = other_id
      ORDER BY order_column)
  WITH NO DATA;
Run Code Online (Sandbox Code Playgroud)

我相信这是真正的问题,但我不知道修复/解决方法.它也令人困惑,因为即使它是在没有数据的情况下创建的,随后的REFRESH MATERIALIZED VIEW应填充它并将其标记为可扫描.

Postgres或AR是否存在一些我不知道的问题是阻止我填充这个物化视图?

pmi*_*hna 3

我知道这个问题是在大约两年前提出的,但也许我的答案对其他人有用。

尝试使用风景宝石。我最近写了一篇关于它的博客文章