在其父 class 中初始化时自动投射活动记录子 class

Automatically cast an active record child class on initialisation in its parent class

我有一个订阅模型,它有子 class SubscriptionCleaning,订阅有一个 subscription_type_id,其中 1 是 SubscriptionCleaning。我还有一个 SubscriptionType 模型。

我想要发生的是当我做的时候

Subscription.find(100) 其订阅类型 ID 为 1

自动施放 SubscriptionCleaning

我试过对我的订阅进行初始化方法class

after_initialize :my_test
#
def my_test
    if self.subscription_type_id.present?
        self.becomes!('SubscriptionCleaning'.constantize)
    end
end

此错误与 NoMethodError: undefined method `type=' for

我可以在控制台中逐行执行它 returns 很好但不能作为订阅的初始化

有人对如何让它发挥作用有任何想法吗?

看一下Single table 继承,由type 列解决。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance

更新:

link 不是很有用。简短说明,您可以删除 subscription_type_id 列并添加 type 列。如果您创建一个模型 SubscriptionCleaning < Subscription,它将保留在与 Subscription 模型相同的列中,并且您可以开箱即用 "type casting"。