如果未创建子项以匹配其ID

时间:2018-06-14 17:17:22

标签: ruby-on-rails ruby database activerecord

如果没有创建子项,是否有一种简单的方法可以追溯删除父对象?

has_many和belongs_to relationship。

我想保持我的parent.id和child.parent_id同步,如果我的父对象持续存在,并且没有创建子节点,我将留下异步ID。

任何帮助?

我保持这种一般性并寻找一般答案!

2 个答案:

答案 0 :(得分:0)

让主动记录验证完成您的工作。你知道你可以这样做:

class Teacher < ActiveRecord::Base
  has_many :teacher_students
  has_many :students, :through => :teacher_students
  validates :students, :length => { :minimum => 1 }
end

或者如果您不想在create:

上验证这一点
class Teacher < ActiveRecord::Base
  has_many :teacher_students
  has_many :students, :through => :teacher_students
  validates :students, :length => { :minimum => 1 }, on: :update
end

答案 1 :(得分:0)

我不确定你的意思是保持id'同步'。如果您使用父项创建子项,请执行以下操作:<form class="form"> <input type="text" class="form__input form--open"> <button class="form__button">Search!</button> </form> ,它们永远不会有所不同。

听起来,就像你正在做的那样是首先创建父节点,然后创建子节点,但所有节点都在同一个动作中。但是,有时由于验证失败或某些原因而未创建子项,并且您不希望创建父项。有几种方法可以做到这一点。

最干净的是parent.children.create(attributes)

型号:

accepts_nested_attributes

控制器

class Parent
  has_many :children, inverse_of: parent
  accepts_nested_attributes_for :children
end

class Child
  belongs_to :parent, inverse_of :children
end

你的参数必须像上面的结构一样嵌套,但它允许父接受子的属性并同时实例化和创建两者。

或者,您可以在事务块中使用创建父项和子项,这将回滚在抛出异常时完成的所有事务。因此,您可以使用ParentController def create parent.create(parent_params) end def parent_params params.require(:parent).permit(:parent_attribute_1, :parent_attribute_2, :children_attributes => [:child_attribute_1, etc.]) end end save!方法确保只有在事务块内的所有内容都能正常工作时才能完成事务。