gpt4 book ai didi

ruby-on-rails - Mongoid "reverse polymorphism"?如何在一个与类名不匹配的字段下嵌入多个类类型

转载 作者:行者123 更新时间:2023-12-04 06:12:19 25 4
gpt4 key购买 nike

我有一个父对象 Order,我需要嵌入一个 channel 对象。问题是,作为 channel 的对象可以是名为 Channels 的模块中的 N 个类之一。

我一直收到以下错误,因为 Mongoid 无法为关系查找正确的类。我怎样才能从本质上告诉 Mongoid :class 字段的类可以是几个之一?本质上,在我创建它需要 Channels 模块中的具体类的顺序之前,我不会知道。

(这看起来有点像“反向多态性”,因为它是必须处理多种类型的父项,而不是可嵌入多种类型的父项的子项。)

我的类(class)是这样的:

class Order
# ...
with_options cascade_callbacks: true do |o|
o.embeds_one :channel
# I've tried several combinations of making the child object polymorphic
# using the `as`/`belongs_to` syntax, to no avail
end
# ...
end

module Channels
class Base
embedded_in :order
# lots of code here that all concrete channels share
end

# then there are concrete subclasses of Channels::Base, e.g.
class Channel1 < Channels::Base
# specifics omitted...
end

class Channel2 < Channels::Base
# specifics omitted...
end
end

尝试在 shell 中加载/保存订单时出现的错误是:NameError: uninitialized constant Channel

最佳答案

facepalm 解决方案非常简单,从错误/堆栈跟踪中应该很明显:

  1. 要么创建一个名为Channel 的基类(不在Channels 模块中),要么
  2. 指定类名作为基类,例如o.embeds_one :channel, class_name: "Channels::Base"

这些都可以工作,并允许我使用适合我 channel 的具体子类覆盖该字段。

错误是由于 Mongoid 在后台调用 #constantize(或等价物),并且不存在 Channel 基类。

关于ruby-on-rails - Mongoid "reverse polymorphism"?如何在一个与类名不匹配的字段下嵌入多个类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26094193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com