单个模型具有两个文件附件列-Rails 4 +回形针

时间:2018-11-19 18:06:00

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip

我有一个自定义模型,该模型在rails中使用附件模型。 我的附件模型看起来像这样

class Attachment < ActiveRecord::Base
  belongs_to :attachable, polymorphic: true
  has_attached_file :file, styles: { logo: ['200x50>',:png] }
end

和其他使用附件的模型看起来像这样

class User < ActiveRecord::Base
  has_many :attachments, as: :attachable, dependent: :destroy
end

我希望用户模型具有与我已经设置的用于上传徽标的附件不同的附件,类似

has_one :user_logo, -> {where attachable_type: "UserLogo"}, class_name: "Attachment", foreign_key: :attachable_id, foreign_type: :attachable_type, dependent: :destroy

但是当我尝试访问attachment.attachable时,我会得到

undefined UserLogo as **UserLogo** is not a model

任何人都可以建议我可以进行哪些更改,以便attachment.attachable适用于两种附件类型。

例如

当我执行类似的操作

att = Attachment.find(3) #假定它以用户身份返回可附加类型 因此att.attachable返回用户对象

但是当我执行时 att = Attachment.find(3) #假定它以UserLogo的形式返回可附加类型 因此att.attachable返回异常wrong constant name UserLogo

如何从两种附件类型访问User对象。谢谢

1 个答案:

答案 0 :(得分:2)

保留可连接的类型“用户”,该类型将是干净的多态的。在“附件”模型中定义具有两个值的 type 字段徽标文件

协会将如下更新

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中的attachable_type使用,则它不会遵循多态关联,因此请定义自定义关联。

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