【问题标题】:Polymorphism ignored by mongoidmongoid 忽略的多态性
【发布时间】:2016-12-12 15:45:30
【问题描述】:

简而言之

我在验证/模型保存时遇到以下错误

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

【问题讨论】:

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


    【解决方案1】:

    调试了好久,终于找到了问题

    gems/mongoid-6.0.0/lib/mongoid/relations/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?
    

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多