0

В двух словахполиморфизм игнорируется Mongoid

Я бегу в следующее сообщение об ошибке с Validations/модель экономии

NameError (uninitialized constant PolymorphicAssociation):

фон & код

Рассмотрим следующие модели (опуская 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' 

Я пытаюсь найти или обновить существующие MediaViews через службу

# 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! 

После сохранения @view я бегу в

NameError (uninitialized constant Media):

ответ

0

После довольно много времени проводило отладку, я наконец-то нашел ошибку в

камней/Mongoid-6.0.0/Библиотека/Mongoid/отношений/accessors.rb

Линия type = @attributes[metadata.inverse_type] возвращается ноль для моей полиморфной ассоциации вместо имя класса.

Почему metadata.inverse_type (здесь media_type) null? Это очень хороший вопрос. И это связано с тем, как создается объект MediaView.

Я пытался найти существующий вид первого использования

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

Проблема с этим, то, что он не устанавливает _type атрибуты полиморфной ассоциации. Мне пришлось добавить следующую строку:

@view.media = @media unless @view.persisted? 
Смежные вопросы