我与has_one
和Device
有Car
关系。
用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
答案 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