2013-03-27 75 views
3

编辑:重写整个问题!Rails如何将STI模型转换为其父模型?

class Product < ActiveRecord::Base 
end 

class ExternalProduct < Product 
end 

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

assert ExternalProduct.some_method == Product 

编辑:我不看如何坚持这一点。我正在研究如何将ExternalProduct转变为产品。

EDIT2:

如果这是我的输入:

:external_product 

我怎样才能把它知道任何的子类或STI的到正确的模型,即Product

+0

您使用的是哪个版本的Rails?该代码(减去'get_true_model')给了我'ExternalProduct'。 – sevenseacat 2013-03-27 11:59:11

+0

关于您的代码编辑,非常感谢@sevenseacat。 – 2013-03-27 11:59:36

+0

使用ActiveRecord 3.2.12 – 2013-03-27 12:00:30

回答

3

ExternalProduct.base_class是您想要的方法。

superclass不同,它实际上会为您提供STI基类,因此如果层次结构发生变化或者您完全传入其他对象,它仍会返回相应的类。

查看base_class的源代码,以及STI内部使用的here

+0

永远不要说谢谢,谢谢! :) – 2014-08-07 10:49:16

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" 
+0

'Product.superclass'等于'ActiveRecord :: Base',所以你建议我检查它的父类是否是ActiveRecord :: Base?适用于使用activerecord当然,我标记的问题是,但与例如不兼容。 Mongoid。 – 2013-03-27 12:18:51

1

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

@product = @external_product.becomes(Product)

这是做等价的:

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

也许不是你的问题的答案,但可能有助于其他遇到此问题的人。

+0

这应该是@ @ external_product.becomes(Product)'(类名不是字符串) – kittyminky 2017-05-18 06:25:10

+1

@kittyminky编辑提交,感谢您的支持! – 2017-05-18 06:28:16