Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails如何将STI模型转换为其父模型?_Ruby On Rails_Ruby On Rails 3_Metaprogramming - Fatal编程技术网

Ruby on rails Rails如何将STI模型转换为其父模型?

Ruby on rails Rails如何将STI模型转换为其父模型?,ruby-on-rails,ruby-on-rails-3,metaprogramming,Ruby On Rails,Ruby On Rails 3,Metaprogramming,编辑:重写整个问题 class Product < ActiveRecord::Base end class ExternalProduct < Product end 编辑:我不想知道如何断言这一点。我正在研究如何将外部产品转化为产品 编辑2: 如果这是我的输入: :external_product 如何在不知道任何子类或STI的情况下将其转换为正确的模型,即产品?这就是如何获得超级类的方法 >> ExternalProduct.superclass.name &

编辑:重写整个问题

class Product < ActiveRecord::Base
end

class ExternalProduct < Product
end
编辑:我不想知道如何断言这一点。我正在研究如何将外部产品转化为产品

编辑2:

如果这是我的输入:

:external_product

如何在不知道任何子类或STI的情况下将其转换为正确的模型,即
产品

这就是如何获得超级类的方法

>> ExternalProduct.superclass.name
>> "Product"
下面是一个获得超级类的示例

>> e = ExternalProduct.first
>> ExternalProduct(id: 1, author_id: 1)
>> e.class
>> ExternalProduct(id: integer, author_id: integer
>> e.class.superclass
>> Product(id: integer, author_id: integer
>> e.class.superclass.name 
>> "Product"

ExternalProduct.base\u class
是您想要的方法

超类不同,它实际上会为您提供STI基类,因此,如果层次结构发生变化或您传入一个不同的对象,它仍然会返回相应的类


查看
基本类的源代码,以及STI内部如何使用它。

如果您有
外部产品的实例,但希望它是
产品的实例,您可以执行以下操作:

@product=@external\u product.变成(产品)

这相当于:

@product=product.new(@external\u products.attributes)


可能不是您问题的答案,但可能对其他遇到此问题的人有所帮助。

您使用的是什么版本的Rails?该代码(减去
get\u true\u model
)为我提供了
ExternalProduct
。关于您的代码编辑,非常感谢@sevensacat。使用ActiveRecord 3.2。12@sevenseacat我希望它返回“产品”,将编辑问题变得更清楚。哦,对了,我误解了你们的意思,对不起
Product.superclass
等于
ActiveRecord::Base
,所以您建议我检查它的超类是否为ActiveRecord::Base?当然,在使用activerecord时有效,我已将问题标记为是,但与例如Mongoid不兼容。这应该是
@external\u product.bes(product)
(类名不是字符串)@kittyminky edit submitted,感谢您的关注!
>> e = ExternalProduct.first
>> ExternalProduct(id: 1, author_id: 1)
>> e.class
>> ExternalProduct(id: integer, author_id: integer
>> e.class.superclass
>> Product(id: integer, author_id: integer
>> e.class.superclass.name 
>> "Product"