Как украсить вложенные ассоциации activerecord в Rails - PullRequest
2 голосов
/ 14 июня 2019

Я работаю с набором gallery_collection, у которого has_many collection_objects и has_many улучшенных_объектов с помощью этих collection_objects

class Collection < ActiveRecord::Base
 has_many :collection_objects, inverse_of: :gallery_collection
 has_many :enhanced_objects, through: :collection_objects

В конечном итоге в моем представлении GalleryCollection я представляю отдельные расширенные_объекты и хочу показать методы, доступные через EnhancedObject.декоратор.В моем конкретном примере я хочу иметь возможность вызывать метод object_record_url

Если я декорирую gallery_collection, я также могу декорировать collection_objects с помощью decorates_association в GalleryCollectionDecorator

class GalleryCollectionDecorator < Draper::Decorator
  include ActionView::Helpers::UrlHelper

  delegate_all
  decorates_association :collection_objects, with: CollectionObjectDecorator

Это хорошо работает, но затем я хочу иметь возможность получить доступ к конкретному расширенному объекту из коллекции collection_objects и для его оформления.

Я также пытался использовать decorates_association в CollectionObjectDecorator

class CollectionObjectDecorator < Draper::Decorator
  delegate_all
  decorates_association :enhanced_objects, with: EnhancedObjectDecorator
end

но, похоже, это не работает, когда я запускаю каскад украшений с уровня GalleryCollection.

В настоящее время я проверяю результаты в консоли с помощью следующего:

collection = GalleryCollection.find(3)
decorated_col = collection.decorate 

- возвращает GalleryCollectionDecorator

collection_objects = decorated_col.collection_objects 

- возвращает CollectionObjectDecorator

enhanced_object = collection_objects[0].enhanced_object 

- возвращает неокрашенный улучшенный_объект

enhanced_object.object_record_url

- возвращает метод без методаошибка, поскольку он не имеет доступа к методу декоратора

Я хотел бы иметь возможность получить доступ к методу декораторас расширенного объекта, к которому я обращаюсь из GalleryCollection.Есть ли способ сделать это, используя decorates_association, или есть лучший, более «рельсовый» способ добиться этого?

...