ruby-on-rails - 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>)
解决方案
如何使用through
和重命名文件关联,例如:
用户:
has_many :loot_files, class_name: 'Loot::File'
has_many :files, through: :loot_files
然后您应该能够使用:
user.loot_files.files
user.files
推荐阅读
- c++ - 从基类调用派生类中的非虚函数(C++)
- haskell - 从用户输入中读取浮点数或字符串
- java - 给定安排的河内解决塔
- python - 如何从 Pandas 返回单元格值而不是系列?
- python - 安排python,作业继续运行
- javascript - 在 Postman 中没有使用 delete 运算符替换变量
- c# - JustMock 将按顺序返回许多返回
- python - 迁移到 Azure 机器学习工作室时,模型会产生不同的结果
- android - 在 Android 10 上从 URL 加载图像失败
- python - 正则表达式 python:抓取数据 b/w 特殊字符 (|)