为什么验证存在甚至没有声明验证规则?

时间:2018-06-18 11:54:31

标签: ruby-on-rails ruby-on-rails-5.1 ruby-2.4

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。谢谢。

2 个答案:

答案 0 :(得分:2)

这是因为foreign_key: true。您在数据库级别而不是应用程序(模型)中遇到错误。

如Active Record Migrations Rails指南的Foreign KeysActive 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