首页 > 解决方案 > Rails:保存子对象时如何运行父对象验证?

问题描述

我有两个模型, Post 和 User 。代码如下图

class User
 has_one :post
 validates_associated :post
 validates_presence_of :name
end

class Post
 belongs_to :user
 validates_presence_of :description
 #validates_associated :user
end

user = User.new
user.build_post # creating post without description
user.save 
user.valid? => false  #This is working as expected

post = Post.new
post.build_user
post.save
post.valid? => true  

我期待post.valid?返回 false 因为我提供了空的 ' name'。当我保存帖子对象时,看起来在用户模型上定义的验证没有运行。我不能validates_associated :user在后期模型中使用,因为它会给出“循环依赖”错误。我的问题是如果validates_associated :user不能在后期模型中使用,那么还有什么替代方法?

标签: ruby-on-rails

解决方案


根据https://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_associated

validates_associated 不适用于 has_one 关联

validates建议在has_one关联上使用:

class User
 has_one :post, validates: true
end

请注意,我没有对此进行测试,只是根据该来源提出建议。


推荐阅读