我已经搅动了这门课
module AccountActivities
class Churned < AccountActivity
belongs_to :subscription, class_name: 'NewSubscription'
end
end
现在,我有另一个订阅表,名为 SubscriptionA。
我想要实现的是
@subscription_activity = AccountActivities::Chunrned.create!(
subscription: subscription(in this case this could be NewSubscription or SubscriptionA class instance),
)
我希望在创建活动时能够将两个不同的类实例(NewSubscription 或 SubscriptionA)传递给 :subscription。我不想更改当前的数据库模式,因此多态关联为 :subscriptable 我不想做的事情。
我尝试过类似的方法,但不起作用
class Churned < AccountActivity
belongs_to :plan
belongs_to :subscription, class_name: :determine_subscription_class
private
def determine_subscription_class
if some_condition about :plan
'NewSubscription'
else
'SubscriptionA'
end
end
end
我知道已经有评论说多态关联是你的选择。但要有一个答案。
class Churned < ApplicationRecord
belongs_to :subscription, polymorphic: true
end
class SubscriptionOne < ApplicationRecord
has_many :churned, as: :subscription
end
class SubscriptionTwo < ApplicationRecord
has_many :churned, as: :subscription
end
在迁移中你必须使用
t.references :subscription, polymorphic: true
或者手动添加 2 个字段:
subscription_id
和 subscription_type
以及索引。
如果使用任何外键约束,您将无法依赖外键约束,这超出了许多数据库(例如 Postgres)的标准行为,但这应该不是什么大问题。