Как добавить материализованные виды в рельсы 5

Я хочу добавить Материализованные представления для среднего рейтинга.

Моя модель оценки:

class Rating < ApplicationRecord
  belongs_to :post
  validates_presence_of :rate
  validates_inclusion_of :rate,in: 1..5
end

Моя модель сообщения:

class Post < ActiveRecord::Base
  has_many :ratings
  accepts_nested_attributes_for :ratings
end

Я хочу найти Avg для поста Использование материализованного представления как

<%= "Avg.rate:#{post.ratings.average(:rate).to_f.round(2)}"%><br>

Я создал миграцию для MV как

class CreateAvgMatView < ActiveRecord::Migration[5.1]
  def change
    execute <<-SQL
      CREATE MATERIALIZED VIEW rateavg_matview AS
      SELECT AVG("ratings"."rate") FROM "ratings"
    SQL
  end
end

Я нахожу проблему как

D013:post_app naren$ rake db:migrate
== 20180813080437 CreateAvgMatView: migrating =================================
-- execute("      CREATE MATERIALIZED VIEW rateavg_matview AS\n        SELECT AVG(\"ratings\".\"rate\") FROM \"ratings\"\n\n")
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: near "MATERIALIZED": syntax error:       CREATE MATERIALIZED VIEW rateavg_matview AS
        SELECT AVG("ratings"."rate") FROM "ratings"

1 ответ

Решение

SQLite не поддерживает материализованные представления. Пожалуйста, прочитайте больше здесь. Как создать материализованное представление в sqlite?

Вам нужно будет переключиться на другую RDMS (например, PostgreSQL) или создать "обычную" таблицу и использовать триггер для ее обновления.

Другие вопросы по тегам