有没有办法在belong_to关联中动态设置class_name

问题描述 投票:0回答:1

我已经搅动了这门课

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
ruby-on-rails ruby reflection associations
1个回答
0
投票

我知道已经有评论说多态关联是你的选择。但要有一个答案。

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)的标准行为,但这应该不是什么大问题。

© www.soinside.com 2019 - 2024. All rights reserved.