mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 15:46:21 +00:00
ceaadeb7bf
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.
44 lines
1.6 KiB
Ruby
44 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
|