Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果没有创建与之匹配的子对象,则删除父对象';身份证_Ruby On Rails_Ruby_Database_Activerecord - Fatal编程技术网

Ruby on rails 如果没有创建与之匹配的子对象,则删除父对象';身份证

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

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

有很多,属于关系

我希望保持parent.id和child.parent_id的同步,如果我的父对象持续存在,并且没有创建子对象,那么我将保留异步id

有什么帮助吗


我将保持此常规,并寻找常规答案!

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

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的不匹配!你让我陷入了一个很好的兔子洞,这导致了一个解决方案。谢谢你