57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class Post
|
||
|
# Vuelve indexables a los Posts
|
||
|
module Indexable
|
||
|
extend ActiveSupport::Concern
|
||
|
|
||
|
included do
|
||
|
# Devuelve una versión indexable del Post
|
||
|
#
|
||
|
# @return [IndexedPosts]
|
||
|
def to_index
|
||
|
@to_index ||= IndexedPost.find_or_create_by(id: uuid.value).tap do |indexed_post|
|
||
|
indexed_post.layout = layout.name
|
||
|
indexed_post.site_id = site.id
|
||
|
indexed_post.path = path.basename
|
||
|
indexed_post.locale = IndexedPost.to_dictionary(locale: locale.value)
|
||
|
indexed_post.title = title.value
|
||
|
indexed_post.front_matter = indexable_front_matter
|
||
|
indexed_post.content = indexable_content
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# Los metadatos que se almacenan como objetos JSON. Empezamos con
|
||
|
# las categorías porque se usan para filtrar en el listado de
|
||
|
# artículos.
|
||
|
#
|
||
|
# @return [Hash]
|
||
|
def indexable_front_matter
|
||
|
return {} unless attribute? :categories
|
||
|
|
||
|
{ categories: categories.indexable_values }
|
||
|
end
|
||
|
|
||
|
# Devuelve un documento indexable en texto plano
|
||
|
#
|
||
|
# XXX: No memoizamos para permitir actualizaciones, aunque
|
||
|
# probablemente se indexe una sola vez.
|
||
|
#
|
||
|
# @return [String]
|
||
|
def indexable_content
|
||
|
indexable_attributes.map do |attr|
|
||
|
self[attr].to_s
|
||
|
end.join("\n")
|
||
|
end
|
||
|
|
||
|
def indexable_attributes
|
||
|
@indexable_attributes ||= attributes.select do |attr|
|
||
|
self[attr].indexable?
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|