5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-05-17 03:40:48 +00:00
panel/db/migrate/20210504224343_create_indexed_posts.rb
f ceaadeb7bf crear la tabla de indexación de posts
los posts se siguen guardando en el sitio jekyll, lo que guardamos en la
base de datos es una representación indexable que tiene los datos
mínimos de los posts para buscarlos por distintos parámetros.

esto nos permite cargar la lista de artículos y filtrarla de distintas
formas sin cargar todo jekyll en memoria, lo que reduciría el consumo de
recursos y aceleraría el panel.  ya tenemos caché así que el problema
estaba mitigado, pero igual es un avance.

ya que migramos la base de datos a postgresql, aparecieron todas las
tablas y campos en el schema.rb, que es lo que usa rails para configurar
una base de datos desde cero.
2021-05-06 12:45:33 -03:00

45 lines
1.6 KiB
Ruby

# frozen_string_literal: true
# Crea la tabla donde se indexa el contenido de los artículos, los
# IndexedPosts van a estar relacionados con un Post del mismo UUID.
#
# Solo contienen la información mínima necesaria para mostrar los
# resultados de búsqueda.
class CreateIndexedPosts < ActiveRecord::Migration[6.1]
def change
# Necesario para gen_random_uuid()
#
# XXX: En realidad no lo necesitamos porque cada IndexedPost va a
# tener el UUID del Post correspondiente.
enable_extension 'pgcrypto'
create_table :indexed_posts, id: false do |t|
t.primary_key :id, :uuid, default: 'public.gen_random_uuid()'
t.belongs_to :site, index: true
t.timestamps
# Filtramos por idioma
t.string :locale, default: 'simple', index: true
# Vamos a querer filtrar por layout
t.string :layout, null: false, index: true
# Esta es la ruta al artículo
t.string :path, null: false
# Queremos mostrar el título por separado
t.string :title, default: ''
# También vamos a mostrar las categorías
t.jsonb :front_matter, default: '{}'
t.string :content, default: ''
t.tsvector :indexed_content
t.index :indexed_content, using: 'gin'
t.index :front_matter, using: 'gin'
end
# Crea un trigger que actualiza el índice tsvector con el título y
# contenido del artículo y su idioma.
create_trigger(compatibility: 1).on(:indexed_posts).before(:insert, :update) do
"new.indexed_content := to_tsvector(('pg_catalog.' || new.locale)::regconfig, coalesce(new.title, '') || '\n' || coalesce(new.content,''));"
end
end
end