Rails在子级上将Foreign_key设置为nil的首选方法

时间:2018-12-05 07:43:39

标签: ruby-on-rails ruby activerecord

我与has_oneDeviceCar关系。

ActiveRecord从父级中删除孩子的首选方式是什么(在device_id上设置car nil但不删除car本身)?

运行device.car = nil行时,它将立即提交到数据库。我希望只在保存时提交它,如果不保存,则返回一些有用的错误。

我知道我也可以尝试查找car,将dongle_id设置为nil并保存,但是此操作实际上是关于device而不是{ {1}}。

变异:

car

型号:

def disconnect_car_and_device(id:)
  device = Device.find(id)

  authorize(current_user, device)

  device.car = nil

  if device.save
    { device: device, errors: [] }
  else
    { device: nil, errors: build_errors(device.errors) }
  end
end

2 个答案:

答案 0 :(得分:1)

尝试了不同的方式后,我发现以下代码可以正常工作:

def disconnect_car_and_device(id:)
  device = Device.find(id)

  authorize(current_user, device)
  car = device.car

  if device.save && car.update(device: nil)
    { device: device, errors: [] }
  else
    { device: nil, errors: build_errors(device.errors) }
  end
end

答案 1 :(得分:1)

def disconnect_car_and_device(id:)
  device = Device.find(id)

  authorize(current_user, device)

  device.transaction do
    device.car = nil

    if device.save
      { device: device, errors: [] }
    else
      raise ActiveRecord::Rollback
      { device: nil, errors: build_errors(device.errors) }
    end
  end
end