首页 > 解决方案 > Rails - 如何将方法委托给集合

问题描述

我正在使用 ActiveStorage 通过 API 上传文件。我的“文件”模型在“Loot”下命名,所以它是“Loot::Files”。文件模型有一个关联(ActiveStorage)“has_many_attached :files”。

用户.rb

has_many :files, class_name: 'Loot::File'

战利品/file.rb(战利品::文件)

has_many_attached :files

虽然这有效(我可以调用 user.files.files),但在文件上调用文件真的很丑陋和尴尬。

有没有办法保留命名空间“Loot”但只需要调用 user.files 来访问 ActiveStorage 文件?我尝试使用委托,但它似乎无法委托给集合。

更新:我尝试了以下代表

试试 1

用户.rb

delegate :files, to: "Loot::File"

这样,调用“User.first.files”,我收到以下错误

Traceback (most recent call last):
    2: from (irb):3
    1: from app/models/user.rb:46:in `files'
NoMethodError (undefined method `files' for Loot::File(id: integer, user_id: integer):Class)

试试 2

用户.rb

delegate :files, to: :files

错误:

Traceback (most recent call last):
   16: from app/models/user.rb:46:in `files'
   15: from app/models/user.rb:46:in `files'
   14: from app/models/user.rb:46:in `files'
   13: from app/models/user.rb:46:in `files'
   12: from app/models/user.rb:46:in `files'
   11: from app/models/user.rb:46:in `files'
   10: from app/models/user.rb:46:in `files'
    9: from app/models/user.rb:46:in `files'
    8: from app/models/user.rb:46:in `files'
    7: from app/models/user.rb:46:in `files'
    6: from app/models/user.rb:46:in `files'
    5: from app/models/user.rb:46:in `files'
    4: from app/models/user.rb:46:in `files'
    3: from app/models/user.rb:46:in `files'
    2: from app/models/user.rb:46:in `files'
    1: from app/models/user.rb:46:in `files'
SystemStackError (stack level too deep)

尝试 3 - 重命名

我尝试将 Loot::Files 重命名为 Loot:Uploads 并使用以下委托

用户.rb

delegate :files, to: :uploads

但后来我在调用 User.first.files 时得到以下信息

NoMethodError (undefined method `files' for #<Loot::Upload::ActiveRecord_Associations_CollectionProxy:0x00007fdb96ca91c0>)

标签: ruby-on-railsrubydelegatesrails-activestorage

解决方案


如何使用through和重命名文件关联,例如:

用户:

has_many :loot_files, class_name: 'Loot::File'
has_many :files, through: :loot_files

然后您应该能够使用:

user.loot_files.files
user.files

推荐阅读