Ruby on rails 如果没有创建与之匹配的子对象,则删除父对象';身份证
如果没有创建子对象,是否有一种简单的方法可以追溯删除父对象 有很多,属于关系 我希望保持parent.id和child.parent_id的同步,如果我的父对象持续存在,并且没有创建子对象,那么我将保留异步id 有什么帮助吗Ruby on rails 如果没有创建与之匹配的子对象,则删除父对象';身份证,ruby-on-rails,ruby,database,activerecord,Ruby On Rails,Ruby,Database,Activerecord,如果没有创建子对象,是否有一种简单的方法可以追溯删除父对象 有很多,属于关系 我希望保持parent.id和child.parent_id的同步,如果我的父对象持续存在,并且没有创建子对象,那么我将保留异步id 有什么帮助吗 我将保持此常规,并寻找常规答案!让活动记录验证完成您的工作。您知道您可以这样做吗: class Teacher < ActiveRecord::Base has_many :teacher_students has_many :students, :throu
我将保持此常规,并寻找常规答案!让活动记录验证完成您的工作。您知道您可以这样做吗:
class Teacher < ActiveRecord::Base
has_many :teacher_students
has_many :students, :through => :teacher_students
validates :students, :length => { :minimum => 1 }
end
班主任:老师学生
验证:students,:length=>{:minimum=>1}
结束
或者,如果您不想在创建时验证:
class Teacher < ActiveRecord::Base
has_many :teacher_students
has_many :students, :through => :teacher_students
validates :students, :length => { :minimum => 1 }, on: :update
end
班主任:老师学生
验证:students,:length=>{:minimum=>1},on::update
结束
我不确定您所说的保持ID“同步”是什么意思。如果您使用父对象来创建子对象,例如:parent.children.create(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!
方法确保只有在事务块内的一切正常工作时,事务才会完成。感谢您的回复!不幸的是,在我的情况下,这将首先阻止创建家长。有什么建议吗?请尝试@teacher.save(validate:false)在创建操作中。这将跳过验证。@TylerP3358或您可以尝试我在更新的回答中提供的替代解决方案。谢谢Abhilash,我将在几分钟后在这里尝试它!嘿,谢谢您的帮助!我将检查此项。您是对的,我首先创建父项,但我的验证很好。如果有人单击一个链接,将它们从子对象的表单页面中移除,这将导致父对象持久化,但没有子对象。这将增加父ID,但自然不会创建child.parent_ID(或与此相关的ID)如果有必要,我会在前端使用类似于向导的工具一次性创建所有参数。在拥有子对象之前,不要创建父对象。我注意到这与您昨天发布的“嵌套表单:如果第二个表单留空,则删除两个对象”的问题相同?如果是这样,我肯定会使用一些在前端有一个嵌套表单的向导库。嘿,谢谢以赛亚,我会查看它。是的,我昨天发布了它,但没有点击率…我想我应该尝试一种更一般的方法来解决我的问题。谢谢你的帮助!谢谢你的帮助。我没有完全解决如何删除父项的问题,实际上是为了功能原因,解决了。困扰我的是ID的不匹配。我通过在创建时简单地将parent.ID分配给新的child.ID来解决这个问题。不再有ID的不匹配!你让我陷入了一个很好的兔子洞,这导致了一个解决方案。谢谢你