我正在开发Ruby on Rails项目,我正在尝试创建一个验证,检查创建时是否满足任何条件
的
model = Model.new(property: nil)
model.save #not valid
model = Model.new(property: "value")
model.save #valid
model = Model.new
model.children.build
model.save #valid
前两个不是问题,因为我可以轻松检查是否在自定义验证中设置了属性。我遇到麻烦的是最后一个,因为这不起作用:
validate :has_data, on: :create
def has_data
errors.add(:data, "isn't present") if property == nil && self.children.count == 0
end
它显然没有得到任何孩子,因为这些是在验证后创建的。必须在某个地方通过在save()中读取的association.build()添加一个集合,但是通过浏览Rails源我发现我的Ruby和Rails知识缺乏找到如何找到这个集合。
是否有专家可能知道如何检索此数据或其他方式使此验证成为可能?
答案 0 :(得分:0)
我相信执行self.children.count
将返回存在的数据库记录数,这是0,因为您还没有保存它们。请尝试size
:
def has_data
errors.add(:data, "isn't present") if property.nil? && self.children.size == 0
end
答案 1 :(得分:0)
model = Model.new
model.children.build
model.save
我认为问题出在第2行,因为您试图在保存父代之前构建一个子代,当您的代码位于第2行时,模型的ID为nil
,并构建child,child需要parent_id
作为外键。另外,除非您在模型中传递了model.children.build.save
,否则您还需要像这样autosave: true
那样明确地保存子项。
我对您的问题的建议将是这样
model = Model.new
model.save.tap do |result|
result && model.children.build
end
对于验证部分,您可以执行以下操作, 在您的parent.rb
validates_associated: :child, on: create, message: "isn't present" if property.nil?