4

编辑:重写整个问题!

class Product < ActiveRecord::Base
end

class ExternalProduct < Product
end

Rails 有一种将 ExternalProduct 转换为 Product 的方法,这就是我正在寻找的方法。所以我们希望这个断言中有一个真实的值:

assert ExternalProduct.some_method == Product

编辑:我不是在寻找如何断言这一点。我正在研究如何将 ExternalProduct 变成 Product。

编辑2:

如果这是我的输入:

:external_product

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

4

3 回答 3

4

ExternalProduct.base_class是你想要的方法。

不像superclass它实际上会给你 STI 基类,所以如果层次结构发生变化或者你完全传入不同的对象,它仍然会返回适当的类。

在此处查看源代码base_class以及 STI 内部如何使用它。

于 2013-11-06T20:01:34.450 回答
2

如果你有一个实例,ExternalProduct但你希望它是一个实例Product,你可以这样做:

@product = @external_product.becomes(Product)

这相当于做:

@product = Product.new(@external_products.attributes)

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

于 2016-05-18T18:47:33.480 回答
0

这就是你获得超级课程的方式

>> 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"
于 2013-03-27T12:16:49.343 回答