Держите ваш присоединяемый тип «Пользователь», который будет чистым полиморфным. Определите поле type внутри модели «Вложение», имеющее два значения logo & file
Ассоциация будет обновляться как показано ниже
class User < ActiveRecord::Base
has_many :attachments, -> {where type: "file"}, as: :attachable, dependent: :destroy
has_one :user_logo, -> {where type: "logo"}, class_name: "Attachment", foreign_key: :attachable_id, foreign_type: :attachable_type, dependent: :destroy
end
Я предлагаю вам иметь разные стили для прикрепления, в зависимости от того, какой у него тип (логотип / файл). Проверка для типа вложения также зависит от типа.
has_attached_file :file, styles: ->(file){ file.instance.get_styles }
validates_attachment_content_type :file, :content_type: [..], if: -> { type == 'logo' }
validates_attachment_content_type :file, :content_type: [..], if: -> { type == 'file' }
def get_styles
if self.type == 'logo'
style1
elsif self.type == 'file'
style2
end
end
Пожалуйста, обновите статус или любой запрос, который вы получите.
Обновление - ответ на следующий вопрос
Первый способ: Если вы используете UserLogo
в качестве присоединяемого_типа в Attachment
, тогда он не следует полиморфной ассоциации, поэтому определите пользовательскую ассоциацию.
belongs_to :resource,
-> { |attachment| ['User', 'UserLogo'].include? attachment.attachable },
class_name: 'User',
foreign_key: :attachable_id
belongs_to :belongs_to :attachable,
-> { |attachment| ['User', 'UserLogo'].exclude? attachment.attachable_type },
class_name: :attachable_type,
foreign_key: :attachable_id
Второй способ: Создать UserLogo
расширение класса User
класс. Он найдет UserLogo с теми же данными пользователя