Rails-验证关联的存在吗?


107

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

Answers:


167

您可以使用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 => true以下对象一起使用,则存在一个错误:嵌套模型和父验证。在本主题中,您可以找到解决方案。


18

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


6

您可以使用validates_existence_of(是一个插件)验证关联:

此博客条目中的示例片段:

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答案下方的注释中所指出的那样,validates_associated通过运行关联的类验证来检查关联的对象是否有效。它检查存在。同样重要的是要注意,零关联被认为是有效的。


4

如果要确保关联既存在又保证有效,则还需要使用

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

如果您可以传递一个额外的选项来validates喜欢valid: true而不是不必validates_associated单独致电,那不是很好。
约书亚·品特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.