如何确定活动存储关联?

时间:2019-03-13 20:11:16

标签: ruby-on-rails rails-activestorage

对于使用活动存储附件的所有型号,我都有一个上传表单。此格式的功能可以更改,具体取决于上传者是has_one_attached还是has_many_attached。有没有确定特定模型具有哪种关联类型的方法?

3 个答案:

答案 0 :(得分:1)

您可以使用reflect_on_all_associations:

https://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflect_on_all_associations

Account.reflect_on_all_associations   # returns an array of all associations
Account.reflect_on_all_associations(:has_many)  # returns an array of all has_many associations

我还没有尝试过,但我假设:

Model.reflect_on_all_associations(:has_one_attached)

如果模型为:has_one_attached,将包含一条记录,否则为空。

答案 1 :(得分:0)

我不喜欢这种方法,但是它有效。我所有的模型都只有一个附件关联。如果模型具有多个附件关联,则此操作会中断。我将继续对此进行微调。

def can_have_many_attachments?
  uploader_name.present? &&
    uploader_name.ends_with?('s')
end

def uploader_name
  self.class.reflect_on_all_attachments.last.name.to_s
end

答案 2 :(得分:0)

以下似乎有效,至少对于Active Storage。

ModelName.reflect_on_all_associations.select { |a|
  a.class_name == 'ActiveStorage::Attachment'
}

如果只需要属性名称:

ModelName.reflect_on_all_associations.select { |a|
  a.class_name == 'ActiveStorage::Attachment'
}.map(&:name)