蒙脱石忽略了多态性

时间:2016-12-12 15:45:30

标签: ruby-on-rails mongodb polymorphism ruby-on-rails-5 mongoid6

简而言之

我通过验证/模型保存

遇到以下错误
  

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

1 个答案:

答案 0 :(得分:0)

经过一段时间的调试后,我终于找到了

中的错误

宝石/ mongoid-6.0.0 / LIB / mongoid /关系/ 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?