class Middleman::Blog::Similar::Database
Attributes
taggers[R]
Public Class Methods
new(path, taggers)
click to toggle source
# File lib/middleman-blog-similar/database.rb, line 13 def initialize(path, taggers) ActiveRecord::Base.establish_connection( adapter: 'sqlite3', database: path ) Migration.apply @taggers = taggers @id_map = {} end
Public Instance Methods
execute_article(resource)
click to toggle source
# File lib/middleman-blog-similar/database.rb, line 37 def execute_article(resource) source_file = resource.source_file page_id = resource.page_id digest = ::Digest::SHA1.file(source_file).hexdigest return page_id if Article.exists?(digest: digest, page_id: page_id) article = Article.find_or_create_by(page_id: page_id) new_tagging_ids = [] @taggers.each do |tagger| tags = tagger[1].call resource tags = [tags] unless tags.is_a?(Array) tags.map(&:downcase).each do |tag_name| tag = Tag.find_or_create_by name: tag_name tagging = Tagging.find_or_create_by tag_id: tag.id, article_id: article.id tagging.weight = tagger[0] tagging.save! new_tagging_ids << tagging.id end end if new_tagging_ids.any? article.taggings.where.not(id: new_tagging_ids).delete_all end article.update! digest: digest page_id end
find_similar(article)
click to toggle source
# File lib/middleman-blog-similar/database.rb, line 62 def find_similar(article) article = Article.find_by(page_id: article.page_id) return [] unless article article.similar_article_page_ids.map do |page_id| @id_map[page_id] end.select(&:present?) end
store_articles(resources)
click to toggle source
# File lib/middleman-blog-similar/database.rb, line 23 def store_articles(resources) @id_map = {} ActiveRecord::Base.transaction do ids = [] resources.each do |res| next unless res.is_a?(Middleman::Blog::BlogArticle) execute_article res ids << res.page_id @id_map[res.page_id.to_s] = res end Article.where.not(page_id: ids).delete_all unless ids.empty? end end