4

編集:質問全体を書き直します!

class Product < ActiveRecord::Base
end

class ExternalProduct < Product
end

RailsにはExternalProductをProductに変える方法があり、それが私が探している方法です。したがって、このアサートには真の値が必要です。

assert ExternalProduct.some_method == Product

編集:私はこれを主張する方法を探していません。私はExternalProductをProductに変える方法を見ています。

EDIT2:

これが私の入力である場合:

:external_product

サブクラス化やSTIを知らずに正しいモデルに変換するにはどうすればよいProductですか?

4

3 に答える 3

4

ExternalProduct.base_classあなたが望む方法です。

実際にSTI基本クラスを提供するのとは異なりsuperclass、階層が変更された場合、またはまったく別のオブジェクトを渡した場合でも、適切なクラスが返されます。

のソース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 に答える