Как добавить материализованные виды в рельсы 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) или создать "обычную" таблицу и использовать триггер для ее обновления.