0

Auf den Punkt gebrachtPolymorphismus ignoriert von mongoid

Ich laufe in den folgenden Fehler mit Validierungen/Modell Speichern

NameError (uninitialized constant PolymorphicAssociation):

Hintergrund & Code

Betrachten Sie die folgenden Modelle (Weglassen Mongoid::Document)

class User 
    has_many :media_views 

class MediaView 
    field :last_seen_at, type: DateTime 
    belongs_to :user 
    belongs_to :media, polymorphic: true 

class Image 
    has_many :views, inverse_of :media, class_name: 'MediaView' 

class Video 
    has_many :views, inverse_of :media, class_name: 'MediaView' 

Ich versuche MediaViews über einen Dienst bestehenden

# my_view_service.rb 
class ViewService 
    def initialize(user, media) 
    @user = user 
    @media = media 
    end 

    def just_viewed! 
    set_view 
    @view.last_seen_at = Time.now 
    @view.save 
    end 

    def set_view 
    @view = MediaView.where(
     user: @user, 
     media: @media, 
    ).first_or_initialize 
    end 

ViewService.new(User.first, Image.first).just_viewed! 

Nach dem Speichern der @view ich in laufen zu finden oder aktualisieren

NameError (uninitialized constant Media):

Antwort

0

nach einiger Zeit das Debuggen verbrachte, fand ich endlich den Fehler in

Edelsteine ​​/ mongoid-6.0.0/lib/mongoid/relations/accessors.rb

Die Linie type = @attributes[metadata.inverse_type] zurück nil für meine polymorphe Vereinigung statt der Klassenname

Warum ist metadata.inverse_type (hier media_type) null? Das ist eine wirklich gute Frage. Und es hat damit zu tun, wie das MediaView-Objekt erstellt wird.

Ich versuche zuerst

@view = MediaView.where(
    user: @user, 
    media: @media, 
).first_or_initialize 

Das Problem dabei vorhandene Ansicht zu finden, ist, dass es nicht die _type Attribute der polymorphen Assoziation nicht eingestellt. Ich musste die folgende Zeile

@view.media = @media unless @view.persisted? 
hinzufügen