app/models/cmor/showcase/item.rb in cmor_showcase-0.0.36.pre vs app/models/cmor/showcase/item.rb in cmor_showcase-0.0.37.pre
- old
+ new
@@ -7,28 +7,85 @@
has_many_attached :assets
acts_as_list scope: :category
acts_as_published
+
+ # slugs
+ extend FriendlyId
+ friendly_id :name, use: :slugged
+
acts_as_markup :body, Cmor::Core::Configuration.default_markup_options
validates :name, presence: true, uniqueness: { scope: [ :category_id ] }
module PreviewPictureConcern
extend ActiveSupport::Concern
- def images
- assets.joins(:blob).where("active_storage_blobs.content_type LIKE '%image/%'")
+ def preview_picture
+ file_details.images.first
end
+ end
- def non_images
- assets.joins(:blob).where("active_storage_blobs.content_type NOT LIKE '%image/%'")
+ include PreviewPictureConcern
+
+ module FileDetailsConcern
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :file_details, inverse_of: :item, dependent: :destroy, autosave: true do
+ def images
+ joins(asset: :blob).where("active_storage_blobs.content_type LIKE '%image/%'")
+ end
+
+ def non_images
+ joins(asset: :blob).where("active_storage_blobs.content_type NOT LIKE '%image/%'")
+ end
+ end
+ before_validation :cleanup_orphaned_file_details
+ before_validation :ensure_file_details
end
- def preview_picture
- images.first
+ def append_assets
+ assets
end
+
+ def append_assets=(assets)
+ if Rails.version < '6.0.0'
+ self.assets = assets
+ else
+ self.assets.attach(assets)
+ end
+ end
+
+ def overwrite_assets
+ assets
+ end
+
+ def overwrite_assets=(assets)
+ return if assets.nil? || assets.empty?
+ self.file_details.map { |fd| fd.mark_for_destruction }
+ self.assets = assets
+ end
+
+ private
+
+ def cleanup_orphaned_file_details
+ file_details.each do |file_detail|
+ file_detail.destroy if file_detail.asset.nil?
+ end
+ end
+
+ def ensure_file_details
+ (assets - file_details.all.map(&:asset)).map do |asset|
+ build_file_detail_for_asset(asset)
+ end
+ end
+
+ def build_file_detail_for_asset(asset)
+ file_details.build(asset: asset)
+ end
end
- include PreviewPictureConcern
+ include FileDetailsConcern
end
end