|
- require 'mini_magick'
-
-
- class Post < ApplicationRecord
- belongs_to :parent, class_name: 'Post', optional: true, foreign_key: 'parent_id'
- belongs_to :uploaded_user, class_name: 'User', optional: true
- has_many :post_tags, dependent: :destroy
- has_many :tags, through: :post_tags
- has_many :user_post_views, dependent: :destroy
- has_many :post_similarities_as_post,
- class_name: 'PostSimilarity',
- foreign_key: :post_id
- has_many :post_similarities_as_target_post,
- class_name: 'PostSimilarity',
- foreign_key: :target_post_id
- has_one_attached :thumbnail
-
- def as_json options = { }
- super(options).merge({ thumbnail: thumbnail.attached? ?
- Rails.application.routes.url_helpers.rails_blob_url(
- thumbnail, only_path: false) :
- nil })
- rescue
- super(options).merge(thumbnail: nil)
- end
-
- def related(limit: nil)
- ids_with_cos =
- post_similarities_as_post.select(:target_post_id, :cos)
- .map { |ps| [ps.target_post_id, ps.cos] } +
- post_similarities_as_target_post.select(:post_id, :cos)
- .map { |ps| [ps.post_id, ps.cos] }
-
- sorted = ids_with_cos.sort_by { |_, cos| -cos }
-
- ids = sorted.map(&:first)
- ids = ids.first(limit) if limit
-
- Post.where(id: ids).index_by(&:id).values_at(*ids)
- end
-
- def resized_thumbnail!
- return unless thumbnail.attached?
-
- image = MiniMagick::Image.read(thumbnail.download)
- image.resize '180x180'
- thumbnail.purge
- thumbnail.attach(io: File.open(image.path),
- filename: 'resized_thumbnail.jpg',
- content_type: 'image/jpeg')
- end
- end
|