我的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