简而言之
我通过验证/模型保存
遇到以下错误
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 :(得分: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?