检查模型在创建之前是否具有子项或属性集

时间:2014-12-21 13:33:23

标签: ruby-on-rails validation activerecord

我正在开发Ruby on Rails项目,我正在尝试创建一个验证,检查创建时是否满足任何条件

  • 设置某个属性
  • 它至少有一个具有某种has_many关联的孩子

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知识缺乏找到如何找到这个集合。

是否有专家可能知道如何检索此数据或其他方式使此验证成为可能?

2 个答案:

答案 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?

reference link

相关问题