Rails - 验证关联的存在?

时间:2011-04-16 21:58:50

标签: ruby-on-rails ruby-on-rails-3 validation activerecord

我有一个模型A与另一个模型B有“has_many”关联。我有一个业务要求,插入A需要至少1个相关记录到B.是否有一个方法我可以调用以确保这个是真的,还是我需要编写自定义验证?

4 个答案:

答案 0 :(得分:152)

您可以使用validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base
  has_many :bs
  validates_presence_of :bs
end

或只是validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base
  has_many :bs
  validates :bs, :presence => true
end

但如果您将accepts_nested_attributes_for用于:allow_destroy => trueNested models and parent validation,则会出现错误。在本主题中,您可以找到解决方案。

答案 1 :(得分:15)

-------- Rails 4 ------------

简单validates presence为我工作

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

这样,Profile.create现在将失败。在保存user.create_profile之前,我必须使用profile或关联用户。

答案 2 :(得分:6)

您可以验证与validates_existence_of(这是一个插件)的关联:

来自this blog entry的示例摘录:

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
  validates_existence_of :tag, :taggable

  belongs_to :user
  validates_existence_of :user, :allow_nil => true
end

或者,您可以使用validates_associated。在答案下方Faisal notes in the commentsvalidates_associated通过运行关联的类验证来检查关联对象是否有效。它确实检查是否存在。值得注意的是,nil关联被认为是有效的。

答案 3 :(得分:1)

如果您想确保关联存在且保证有效,您还需要使用

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end