Полиморфизм игнорируется монгоидом

Кратко

Я столкнулся со следующей ошибкой при проверке/сохранении модели

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):


person Cyril Duchon-Doris    schedule 12.12.2016    source источник


Ответы (1)


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

драгоценные камни/монгоид-6.0.0/библиотека/монгоид/отношения/accessors.rb

Строка type = @attributes[metadata.inverse_type] вернула nil для моей полиморфной ассоциации вместо имени класса.

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

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

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

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

@view.media = @media unless @view.persisted?
person Cyril Duchon-Doris    schedule 12.12.2016