【发布时间】:2018-06-14 17:17:21
【问题描述】:
如果没有创建子对象,是否有一种简单的方法可以追溯删除父对象?
has_many 和 belongs_to 关系。
我想保持我的 parent.id 和 child.parent_id 同步,如果我的父对象持续存在,并且没有创建子对象,我将留下异步 ID。
有什么帮助吗?
我保留这个一般性并寻找一般性答案!
【问题讨论】:
标签: ruby-on-rails ruby database activerecord
如果没有创建子对象,是否有一种简单的方法可以追溯删除父对象?
has_many 和 belongs_to 关系。
我想保持我的 parent.id 和 child.parent_id 同步,如果我的父对象持续存在,并且没有创建子对象,我将留下异步 ID。
有什么帮助吗?
我保留这个一般性并寻找一般性答案!
【问题讨论】:
标签: ruby-on-rails ruby database activerecord
我不确定您所说的保持 id '同步'是什么意思。如果您像这样使用父级来创建子级: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! 和create! 方法来确保只有在事务块内的所有内容都正常工作时,事务才会完成。
【讨论】:
让活动记录验证完成您的工作。你知道你可以做这样的事情吗:
class Teacher < ActiveRecord::Base
has_many :teacher_students
has_many :students, :through => :teacher_students
validates :students, :length => { :minimum => 1 }
end
或者如果您不想在创建时验证它:
class Teacher < ActiveRecord::Base
has_many :teacher_students
has_many :students, :through => :teacher_students
validates :students, :length => { :minimum => 1 }, on: :update
end
【讨论】: