如果没有创建子项,是否有一种简单的方法可以追溯删除父对象?
has_many和belongs_to relationship。
我想保持我的parent.id和child.parent_id同步,如果我的父对象持续存在,并且没有创建子节点,我将留下异步ID。
任何帮助?
我保持这种一般性并寻找一般答案!
答案 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!
方法确保只有在事务块内的所有内容都能正常工作时才能完成事务。