0

忽略簡而言之多態性通過mongoid

我碰上節約以下錯誤與驗證/模型

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

相當長的一段時間花在調試後,我終於找到了臭蟲

/lib目錄/ mongoid關係/ accessors.rb

type = @attributes[metadata.inverse_type]返回nil我多態關聯,而不是

寶石/ mongoid-6.0.0 /班級名稱。

爲什麼metadata.inverse_type(這裏是media_type)爲空?這是一個非常好的問題。它與MediaView對象的構建方式有關。

我試圖找到現有的視圖首先使用

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

的問題,這一點,是它不設置多態關聯的_type屬性。我不得不添加以下行

@view.media = @media unless @view.persisted?