2013-03-27 79 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