# == Schema Information # # Table name: images # # id :integer not null, primary key # imageable_type :string(255) not null # imageable_id :bigint(8) not null # image_file_name :string(255) not null # image_content_type :string(255) not null # image_file_size :integer not null # updated_at :datetime # updated_by :integer # position :integer default(0), not null # cover :boolean default(FALSE), not null # active :boolean default(TRUE), not null # # Model store Images for products, categories etc class Image < ApplicationRecord belongs_to :imageable, polymorphic: true has_attached_file :image, path: ':rails_root/public/images/:id/:style/'\ ':id_:slugged:dotextension', url: '/images/:id/:style/:id_:slugged:dotextension', styles: { home: '129x129', small: '45x45', medium: '80x80', large: '260x338', thickbox: '600x600' } # before_post_process :rename_file validates_attachment_content_type :image, content_type: /\Aimage/ validates_attachment_file_name :image, matches: [/png\z/, /jpe?g\z/, /PNG\z/, /JPE?G\z/] do_not_validate_attachment_file_type :image scope :by_image_type, ->(type) { where(imageable_type: type) } scope :by_position_desc, -> { order(position: :desc) } scope :by_position_asc, -> { order(position: :asc) } Paperclip.interpolates :slugged do |attachment, _style| if attachment.instance.imageable.has_attribute?(:slug) attachment.instance.imageable.slug else 't' end end def change_filename(old_name, new_name) (image.styles.keys + [:original]).each do |style| f1 = img_file_name(old_name) f2 = img_file_name(new_name) path = image.path(style).sub(f2, f1) FileUtils.move(path, File.join(File.dirname(path), f2)) end end private def img_file_name(oname) "#{id}_#{oname}.#{image_file_name.split('.')[-1]}" end end