Rails - 验证关联的存在?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails - 验证关联的存在?相关的知识,希望对你有一定的参考价值。

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

答案

你可以使用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一起使用,那就有一个错误。在本主题中,您可以找到解决方案。

另一答案

-------- 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或关联用户。

另一答案

您可以验证与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 comments低于答案,validates_associated通过运行相关的类验证来检查关联对象是否有效。它不会检查是否存在。值得注意的是,nil关联被认为是有效的。

另一答案

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

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

以上是关于Rails - 验证关联的存在?的主要内容,如果未能解决你的问题,请参考以下文章

Rails validates_presence_of 并验证 has_one 关联模型中的存在

Rails 2.3 自定义验证与循环检查存在

ruby 我的博客文章“Rails中更好的条件验证”的片段

rails 范围检查关联是不是不存在

Rails 关联不存在。更好的方法?

如何根据 Rails 中的其他对象验证多对多关联?