invitation.rb如下:
class Invitation < ApplicationRecord .
belongs_to :sender, class_name: 'User'
belongs_to :subscription
end
subscription.rb如下:
class Subscription < ApplicationRecord
has_many :payments, dependent: :destroy
has_one :invitation,
belongs_to :plan
belongs_to :user
end
,用于在邀请中添加列subscription_id的迁移文件为:
class AddSubscriptionIdToInvitations < ActiveRecord::Migration[5.1]
def change
add_reference :invitations, :subscription, foreign_key: true
end
end
虽然我没有在邀请模型中为subscription_id存在指定验证规则。但是当我执行以下代码时,我收到错误'订阅不存在':
@invitation = Invitation.create_with(
message: invitation_params.delete(:message),
first_name: invitation_params.delete(:first_name),
last_name: invitation_params.delete(:last_name),
).find_or_create_by(
receiver: receiver,
sender: current_user
)
Rails版本= 5.1.4,ruby版本= 2.4.3。谢谢。
答案 0 :(得分:2)
这是因为foreign_key: true
。您在数据库级别而不是应用程序(模型)中遇到错误。
如Active Record Migrations Rails指南的Foreign Keys和Active Record and Referential Integrity部分所述,您可以添加外键约束以确保引用完整性。 Active Record方法(验证)声称,情报属于您的模型,而不属于数据库。像在应用程序级别上运行的任何事物一样,它们不能保证引用完整性,因此这就是为什么您可能想在数据库中使用外键约束(如果您希望关系始终存在)的原因。
因此,如果删除外键,将不再收到错误。您可以使用remove_foreign_key
来做到这一点。
答案 1 :(得分:0)
从rails 5开始,belongs_to具有选项“ optional”,该选项默认情况下为false,这就是为什么belongs_to关系默认情况下具有状态验证的原因。要删除验证,我们需要执行以下操作:-
class Invitation < ApplicationRecord .
belongs_to :sender, class_name: 'User'
belongs_to :subscription, optional: true
end