evitar confusiones entre diccionario y locale

el diccionario es lo que usa internamente pg para indexar, el locale es
el idioma que asignamos en sutty.
This commit is contained in:
f 2021-05-07 19:25:09 -03:00
parent d2ae406023
commit 6396841b2c
5 changed files with 43 additions and 21 deletions

View file

@ -17,13 +17,12 @@ class PostsController < ApplicationController
@site = find_site @site = find_site
@locale = locale @locale = locale
dictionary = IndexedPost.to_dictionary(locale: locale)
# XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es # XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es
# más simple saber si hubo cambios. # más simple saber si hubo cambios.
if filter_params.present? || stale?(@site) if filter_params.present? || stale?(@site)
# Todos los artículos de este sitio para el idioma actual # Todos los artículos de este sitio para el idioma actual
@posts = @site.indexed_posts.where(locale: dictionary) @posts = @site.indexed_posts.where(locale: locale)
# De este tipo # De este tipo
@posts = @posts.where(layout: filter_params[:layout]) if filter_params[:layout] @posts = @posts.where(layout: filter_params[:layout]) if filter_params[:layout]
# Que estén dentro de la categoría # Que estén dentro de la categoría

View file

@ -19,7 +19,7 @@ class IndexedPost < ApplicationRecord
query: query, query: query,
using: { using: {
tsearch: { tsearch: {
dictionary: IndexedPost.to_dictionary(locale: locale), dictionary: dictionary,
tsvector_column: 'indexed_content' tsvector_column: 'indexed_content'
}, },
trigram: { trigram: {

View file

@ -18,7 +18,8 @@ class Post
indexed_post.layout = layout.name indexed_post.layout = layout.name
indexed_post.site_id = site.id indexed_post.site_id = site.id
indexed_post.path = path.basename indexed_post.path = path.basename
indexed_post.locale = IndexedPost.to_dictionary(locale: locale.value) indexed_post.locale = locale.value
indexed_post.dictionary = IndexedPost.to_dictionary(locale: locale.value)
indexed_post.title = title.value indexed_post.title = title.value
indexed_post.front_matter = indexable_front_matter indexed_post.front_matter = indexable_front_matter
indexed_post.content = indexable_content indexed_post.content = indexable_content

View file

@ -0,0 +1,29 @@
# frozen_string_literal: true
# Para no estar calculando todo el tiempo el diccionario del idioma,
# agregamos una columna más.
class AddDictionaryToIndexedPosts < ActiveRecord::Migration[6.1]
LOCALES = {
'english' => 'en',
'spanish' => 'es'
}
def up
add_column :indexed_posts, :dictionary, :string
create_trigger(compatibility: 1).on(:indexed_posts).before(:insert, :update) do
"new.indexed_content := to_tsvector(('pg_catalog.' || new.dictionary)::regconfig, coalesce(new.title, '') || '\n' || coalesce(new.content,''));"
end
IndexedPost.find_each do |post|
locale = post.locale
post.update dictionary: locale, locale: LOCALES[locale]
end
end
def down
remove_column :indexed_posts, :locale
rename_column :indexed_posts, :dictionary, :locale
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2021_05_06_212356) do ActiveRecord::Schema.define(version: 2021_05_07_221120) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pg_trgm" enable_extension "pg_trgm"
@ -230,6 +230,7 @@ ActiveRecord::Schema.define(version: 2021_05_06_212356) do
t.string "content", default: "" t.string "content", default: ""
t.tsvector "indexed_content" t.tsvector "indexed_content"
t.integer "order", default: 0 t.integer "order", default: 0
t.string "dictionary"
t.index ["front_matter"], name: "index_indexed_posts_on_front_matter", using: :gin t.index ["front_matter"], name: "index_indexed_posts_on_front_matter", using: :gin
t.index ["indexed_content"], name: "index_indexed_posts_on_indexed_content", using: :gin t.index ["indexed_content"], name: "index_indexed_posts_on_indexed_content", using: :gin
t.index ["layout"], name: "index_indexed_posts_on_layout" t.index ["layout"], name: "index_indexed_posts_on_layout"
@ -360,21 +361,13 @@ ActiveRecord::Schema.define(version: 2021_05_06_212356) do
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
# no candidate create_trigger statement could be found, creating an adapter-specific one create_trigger("indexed_posts_before_insert_update_row_tr", :compatibility => 1).
execute(<<-SQL) on("indexed_posts").
CREATE OR REPLACE FUNCTION public.indexed_posts_before_insert_update_row_tr() before(:insert, :update) do
RETURNS trigger <<-SQL_ACTIONS
LANGUAGE plpgsql new.indexed_content := to_tsvector(('pg_catalog.' || new.dictionary)::regconfig, coalesce(new.title, '') || '
AS $function$
BEGIN
new.indexed_content := to_tsvector(('pg_catalog.' || new.locale)::regconfig, coalesce(new.title, '') || '
' || coalesce(new.content,'')); ' || coalesce(new.content,''));
RETURN NEW; SQL_ACTIONS
END; end
$function$
SQL
# no candidate create_trigger statement could be found, creating an adapter-specific one
execute("CREATE TRIGGER indexed_posts_before_insert_update_row_tr BEFORE INSERT OR UPDATE ON \"indexed_posts\" FOR EACH ROW EXECUTE PROCEDURE indexed_posts_before_insert_update_row_tr()")
end end