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"