Rails - Как делегировать метод в коллекцию - PullRequest
0 голосов
/ 02 мая 2018

Я использую ActiveStorage для загрузки файлов через API. Моя модель «File» находится в пространстве имен «Loot», поэтому это «Loot :: Files». Файловая модель имеет ассоциацию (ActiveStorage) "has_many_attached: files".

User.rb

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

loot / file.rb (Loot :: File)

has_many_attached :files

Хотя это работает (я могу вызвать user.files.files), действительно ужасно и неловко вызывать файлы в файлах.

Есть ли способ сохранить пространство имен "Loot", но нужно только вызвать user.files для доступа к файлам ActiveStorage? Я пытался использовать делегат, но, похоже, не работает делегирование коллекциям.

Обновление: я попробовал следующий делегат

Попробуйте 1

User.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

User.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 to Loot: Загрузка и использование следующего делегата

User.rb

delegate :files, to: :uploads

но тогда я получаю следующее при вызове User.first.files

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

1 Ответ

0 голосов
/ 03 мая 2018

Как насчет использования through и переименования ассоциации файлов, например:

Пользователь:

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

После этого вы сможете использовать:

user.loot_files.files
user.files
...