【发布时间】:2011-08-07 02:07:17
【问题描述】:
我有一个模型 A,它与另一个模型 B 有“has_many”关联。我有一个业务需求,即插入 A 需要至少 1 条关联记录到 B。有没有我可以调用的方法来确保这一点是真的,还是我需要编写自定义验证?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 validation activerecord
我有一个模型 A,它与另一个模型 B 有“has_many”关联。我有一个业务需求,即插入 A 需要至少 1 条关联记录到 B。有没有我可以调用的方法来确保这一点是真的,还是我需要编写自定义验证?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 validation activerecord
你可以使用validates_presence_ofhttp://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 一起使用,则会出现错误:Nested models and parent validation。在本主题中,您可以找到解决方案。
【讨论】:
-------- Rails 4 ------------
简单的validatespresence为我工作
class Profile < ActiveRecord::Base
belongs_to :user
validates :user, presence: true
end
class User < ActiveRecord::Base
has_one :profile
end
这样,Profile.create 现在将失败。在保存profile 之前,我必须使用user.create_profile 或关联用户。
【讨论】:
您可以验证与validates_existence_of(这是一个插件)的关联:
来自this blog entry 的示例 sn-p:
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
【讨论】:
validates 传递一个额外的选项,比如valid: true 而不必单独调用validates_associated,那不是很好。