garantizar que PostRelation siempre usa la misma colección/idioma

This commit is contained in:
f 2021-02-17 18:46:00 -03:00
parent 6edd9e67a2
commit 737416488b
2 changed files with 9 additions and 7 deletions

View file

@ -4,10 +4,11 @@
# artículos como si estuviésemos usando ActiveRecord. # artículos como si estuviésemos usando ActiveRecord.
class PostRelation < Array class PostRelation < Array
# No necesitamos cambiar el sitio # No necesitamos cambiar el sitio
attr_reader :site attr_reader :site, :lang
def initialize(site:) def initialize(site:, lang:)
@site = site @site = site
@lang = lang
# Proseguimos la inicialización sin valores por defecto # Proseguimos la inicialización sin valores por defecto
super() super()
end end
@ -15,7 +16,7 @@ class PostRelation < Array
# Genera un artículo nuevo con los parámetros que le pasemos y lo suma # Genera un artículo nuevo con los parámetros que le pasemos y lo suma
# al array # al array
def build(**args) def build(**args)
args[:lang] ||= I18n.locale args[:lang] = lang
args[:document] ||= build_document(collection: args[:lang]) args[:document] ||= build_document(collection: args[:lang])
args[:layout] = build_layout(args[:layout]) args[:layout] = build_layout(args[:layout])
@ -94,7 +95,7 @@ class PostRelation < Array
@where ||= {} @where ||= {}
@where[args.hash.to_s] ||= begin @where[args.hash.to_s] ||= begin
PostRelation.new(site: site).concat(select do |post| PostRelation.new(site: site, lang: lang).concat(select do |post|
result = args.map do |attr, value| result = args.map do |attr, value|
next unless post.attribute?(attr) next unless post.attribute?(attr)
@ -123,7 +124,7 @@ class PostRelation < Array
# @return [PostRelation] # @return [PostRelation]
alias array_select select alias array_select select
def select(&block) def select(&block)
PostRelation.new(site: site).concat array_select(&block) PostRelation.new(site: site, lang: lang).concat array_select(&block)
end end
# Intenta guardar todos y devuelve true si pudo # Intenta guardar todos y devuelve true si pudo

View file

@ -225,6 +225,7 @@ class Site < ApplicationRecord
# Traemos los posts del idioma actual por defecto # Traemos los posts del idioma actual por defecto
lang ||= I18n.locale lang ||= I18n.locale
lang = lang.to_sym
# Crea un Struct dinámico con los valores de los locales, si # Crea un Struct dinámico con los valores de los locales, si
# llegamos a pasar un idioma que no existe vamos a tener una # llegamos a pasar un idioma que no existe vamos a tener una
@ -233,7 +234,7 @@ class Site < ApplicationRecord
return @posts[lang] unless @posts[lang].blank? return @posts[lang] unless @posts[lang].blank?
@posts[lang] = PostRelation.new site: self @posts[lang] = PostRelation.new site: self, lang: lang
# No fallar si no existe colección para este idioma # No fallar si no existe colección para este idioma
# XXX: queremos fallar silenciosamente? # XXX: queremos fallar silenciosamente?
@ -250,7 +251,7 @@ class Site < ApplicationRecord
# #
# @return PostRelation # @return PostRelation
def docs def docs
@docs ||= PostRelation.new(site: self).push(locales.flat_map do |locale| @docs ||= PostRelation.new(site: self, lang: :docs).push(locales.flat_map do |locale|
posts(lang: locale) posts(lang: locale)
end).flatten! end).flatten!
end end