如果不是nil,则验证是否存在外键

时间:2013-09-12 22:42:40

标签: ruby-on-rails validation foreign-keys null

我在Rails 4中定义了多对一关系:

class Event < ActiveRecord::Base
  belongs_to :user
end

如果设置了:user密钥,我该如何检查?

以下正确检查,密钥存在但不允许“nil”?价值观:

  validates :user, presence: true

以下内容允许任何值,甚至是不存在的ID:

  validates :user, presence: true, allow_nil: true

你如何进行这种验证。

3 个答案:

答案 0 :(得分:1)

您可以使用before_save回调来检查用户是否有效:

class Event < ActiveRecord::Base
  belongs_to :user    

  before_save: :validate_user unless: Proc.new { |event| event.user.nil? }

  private
    def validate_user
      if User.where(id: user_id).empty?
        errors[:user] << "must be valid"
      end
    end

end

答案 1 :(得分:1)

您必须在Event中保留状态验证并添加User模型:

has_many :events, inverse_of: :user

答案 2 :(得分:0)

刚遇到这个问题,这里有2个解决方案

1

validates :user, presence: true, if: 'user_id.present?'

2

https://github.com/perfectline/validates_existence宝石

可以像这样使用

validates : user, existence: { allow_nil: true, both: false }

both选项用于显示错误消息:false将显示1个错误(仅关联),true将显示2个错误(关联和外键)