Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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 接收id从属于不属于';t更新并销毁其父级_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 接收id从属于不属于';t更新并销毁其父级

Ruby on rails 接收id从属于不属于';t更新并销毁其父级,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个自我属于的模型: class SyncType < ActiveRecord::Base belongs_to :sync_type, touch: true has_many :sync_types, -> { order('created_at ASC') } end 但是当我销毁id为99的对象时,它的引用不会在id为95的对象上更新(sync_type_id:99)。我可以做些什么来刷新它?我想在销毁时将sync_type_id:nil放入 根据rails指

我有一个自我属于的模型:

class SyncType < ActiveRecord::Base
  belongs_to :sync_type, touch: true
  has_many :sync_types, -> { order('created_at ASC') }
end
但是当我销毁id为99的对象时,它的引用不会在id为95的对象上更新(sync_type_id:99)。我可以做些什么来刷新它?我想在销毁时将sync_type_id:nil放入

根据rails指南中的“touch:true”,这会起作用,但事实并非如此

我的临时解决方案:

@sync_types_to_destroy.each do |sync_to_destroy|
  sync_to_destroy.sync_types.each do |child|
    child.sync_type = nil
    child.save
  end
  sync_to_destroy.destroy
end

如果您有更好的想法,请帮助我:p

您可以创建一个before_destroy回调来删除其他记录上的链接

class SyncType < ActiveRecord::Base
  before_destroy :remove_links

  private 
  def remove_links
    SyncType.where('sync_type_id = ?', id).update_all(sync_type_id: nil)
  end
end
class-SyncType
在多关联上设置:dependent选项:

has_many :sync_types, -> { order('created_at ASC') }, dependent: :nullify
现在,当您销毁父记录时,子记录的sync_type_id属性将为空

sync_type = SyncType.where("sync_type_id is null").first
sync_type.destroy
使用示例记录,执行以下SQL:

BEGIN
UPDATE `sync_types` SET `sync_types`.`sync_type_id` = NULL WHERE `sync_types`.`sync_type_id` = 99 ORDER BY created_at ASC;
DELETE FROM `sync_types` WHERE `sync_types`.`id` = 99;
COMMIT

谢谢你的帮助,但是上面的答案对我有帮助!
sync_type = SyncType.where("sync_type_id is null").first
sync_type.destroy
BEGIN
UPDATE `sync_types` SET `sync_types`.`sync_type_id` = NULL WHERE `sync_types`.`sync_type_id` = 99 ORDER BY created_at ASC;
DELETE FROM `sync_types` WHERE `sync_types`.`id` = 99;
COMMIT