From 7467356659bead478e0975cf21222f0b52373fe3 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 2 Jan 2020 15:08:45 -0300 Subject: [PATCH] optimizacion: no sumar los atributos todo el tiempo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit con esta optimización bajamos 10s en la generación del índice de posts para observatoriociudad.org y alrededor de medio millón de asignaciones de variables! --- app/models/post.rb | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/app/models/post.rb b/app/models/post.rb index 91d18d9..3e838e0 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -64,14 +64,6 @@ class Post < OpenStruct Digest::SHA1.hexdigest id end - # Levanta un error si al construir el artículo no pasamos un atributo. - def default_attributes_missing(**args) - DEFAULT_ATTRIBUTES.each do |attr| - i18n = I18n.t("exceptions.post.#{attr}_missing") - - raise ArgumentError, i18n unless args[attr].present? - end - end # Solo ejecuta la magia de OpenStruct si el campo existe en la # plantilla @@ -101,12 +93,16 @@ class Post < OpenStruct # Detecta si es un atributo válido o no, a partir de la tabla de la # plantilla def attribute?(mid) - attrs = DEFAULT_ATTRIBUTES + PRIVATE_ATTRIBUTES + PUBLIC_ATTRIBUTES - if singleton_class.method_defined? :attributes - (attrs + attributes).include? attribute_name(mid) - else - attrs.include? attribute_name(mid) + mid = attribute_name mid + included = DEFAULT_ATTRIBUTES.include?(mid) || + PRIVATE_ATTRIBUTES.include?(mid) || + PUBLIC_ATTRIBUTES.include?(mid) + + if !included && singleton_class.method_defined?(:attributes) + included = attributes.include? attribute_name(mid) end + + included end # Devuelve los strong params para el layout @@ -248,6 +244,15 @@ class Post < OpenStruct private + # Levanta un error si al construir el artículo no pasamos un atributo. + def default_attributes_missing(**args) + DEFAULT_ATTRIBUTES.each do |attr| + i18n = I18n.t("exceptions.post.#{attr}_missing") + + raise ArgumentError, i18n unless args[attr].present? + end + end + def document_usuaries document.data.fetch('usuaries', []) end