|
- class Material < ApplicationRecord
- include MyDiscard
-
- default_scope -> { kept }
-
- belongs_to :parent, class_name: 'Material', optional: true
- has_many :children, class_name: 'Material', foreign_key: :parent_id, dependent: :nullify
-
- belongs_to :tag, optional: true
- belongs_to :created_by_user, class_name: 'User', optional: true
- belongs_to :updated_by_user, class_name: 'User', optional: true
-
- has_one_attached :file, dependent: :purge
-
- validates :tag_id, presence: true, uniqueness: true
-
- validate :file_must_be_attached
- validate :tag_must_be_material_category
-
- def content_type
- return nil unless file&.attached?
-
- file.blob.content_type
- end
-
- private
-
- def file_must_be_attached
- return if url.present? || file.attached?
-
- errors.add(:url, 'URL かファイルのどちらかは必須です.')
- end
-
- def tag_must_be_material_category
- return if tag.blank? || tag.character? || tag.material?
-
- errors.add(:tag, '素材カテゴリのタグを指定してください.')
- end
- end
|