如何使RubyonRails模型与自定义字符串列建立关系



我的RubyonRails应用程序中有Customer和Subscription模型。

Customer
id: ID
stripe_costumer_id: String
Subscription
id: ID
stripe_customer_id: String

我想在这两个表之间建立一对多的关系,但使用stripe_customer_id作为外键。

到目前为止我尝试过:

Subscription
belongs_to :paywall_customer, class_name: 'Customer', foreign_key: :stripe_customer_id
Customer
has_one :paywall_subscription, class_name: 'Subscription', foreign_key: :stripe_customer_id

问题是,当我试图创建一个新的订阅时,我会收到这个错误:

ActiveRecord::RecordInvalid: Validation failed: Customer must exist

如果您能帮助我使用stripe_custumer_id来获取这两个表之间的关系,我将不胜感激,在这种情况下,stripe_costumer_id也是一个字符串。

您正在将数据(stripe_customer_id(与关系引用(id(合并。反对Rails范式是不可取的,id字段应该是外键。stripe_customer_id字段是一个与客户相关的值,因此它应该只是客户表中的一个字段,而不是订阅表中的字段。

对于一对多来说,它应该是:

# in app/models/customer.rb
class Customer < ApplicationRecord
has_many :subscriptions
end
# in app/models/subscription.rb
# it has a column 'customer_id'
class Subscription < ApplicationRecord
belongs_to :customer
end

如果您试图以非Rails的方式配置关系,那么最终必然会遇到问题。Rails是固执己见的,我们有义务遵守它的意见。但这是一个很小的代价支付b/c它工作得很好。

更新

您需要将primary_key: :stripe_customer_id添加到关联中。

既然你想要一对多的关系:客户has_many :paywall_subscriptions

Customer
has_many :paywall_subscriptions, class_name: 'Subscription', foreign_key: :stripe_customer_id, primary_key: :stripe_customer_id
Subscription
belongs_to :paywall_customer, class_name: 'Customer', foreign_key: :stripe_customer_id, primary_key: :stripe_customer_id

若要创建订阅,必须填写stripe_customer_id字段。并且具有该stripe_customer_id的客户必须已经存在。


原始

如果您添加型号StripeCustomer,则这可以工作;我们将CCD_ 6字符串存储在CCD_。

Customer
id: ID
stripe_customer_id: String
Subscription
id: ID
stripe_customer_id: String
StripeCustomer
id: ID
uid: String
Customer
belongs_to :stripe_customer, primary_key: :uid
has_many :subscriptions, through: :stripe_customer
Subscription
belongs_to :stripe_customer, primary_key: :uid
has_one :customer, through: :stripe_customer
StripeCustomer
has_one :customer, primary_key: :uid
has_many :subscriptions, primary_key: :uid

相关内容

  • 没有找到相关文章

最新更新