如何在父项无效时阻止保存ActiveRecord子对象?

时间:2015-08-30 11:59:49

标签: ruby-on-rails activerecord

我有一种情况(解析),我需要从子记录开始,添加他们的逻辑父,然后在验证子和父项时保存。

有没有一种标准的方法来处理这个Rails?

考虑到以下关系:

  • has_many子,validates :child, presence: true
  • 儿童belongs_to家长

我看到的内容如下:

p = Parent.new # with a missing required attribute
c = Child.new
c.parent = p # or c.parents << p, this isn't important
p.valid? # false
c.valid? # true
c.save # true

因此,当新关联的父对象出错时,让我保存孩子。

有解决方案吗?我认为,当交换对象时,这可以正常工作,正如预期的那样,它们之间存在关系。

但是,在这种情况下,我不能从父母开始,因为它可能已经存在,我为此做了一个单独的find_or_create。在这种情况下,从子记录开始更合乎逻辑。

Google / SO搜索没有帮助。

2 个答案:

答案 0 :(得分:1)

您可以在子模型中添加custom validator,如下所示:

  validate parent_model_validate

然后,在同一(子)模型中添加parent_model_validate方法:

  def parent_model_validate
    unless self.parent.valid?
      errors.add(:child_model, 'Parent is not valid')
    end
  end

如果父模型无效,此验证器将确保不会保存子模型。

答案 1 :(得分:1)

查看validates_associated here。 (请注意不要在两端使用它)