Ruby on rails Rails在子级上将外键设置为nil的首选方法

Ruby on rails Rails在子级上将外键设置为nil的首选方法,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我与设备和汽车有一个关系 使用ActiveRecord从父项中删除子项的首选方法是什么(在car上设置device\u idnil,但不删除car本身) 当device.car=nil行运行时,它会立即提交到数据库。我希望它只在保存时提交,如果没有保存,则返回一些有用的错误 我知道我也可以尝试查找汽车,将加密狗id设置为nil并保存,但此操作与设备有关,而不是与汽车有关 突变: def disconnect_car_and_device(id:) device = Device.find(i

我与
设备和
汽车有一个
关系

使用
ActiveRecord
从父项中删除子项的首选方法是什么(在
car
上设置
device\u id
nil,但不删除
car
本身)


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

我知道我也可以尝试查找
汽车
,将
加密狗id
设置为
nil
并保存,但此操作与
设备
有关,而不是与
汽车
有关

突变:

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
型号:

class Device < ApplicationRecord
  has_one :car
end

class Car < ApplicationRecord
  belongs_to :device
end
类设备
尝试了不同的方法后,我发现下面的代码可以按预期工作:

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

尝试了不同的方法后,我发现以下代码可以按预期工作:

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

您确定当device.car=nil行运行时,它会被提交到数据库吗?它只会在您保存设备时提交到数据库,否则它会将nil值指定给设备对象,但不会在数据库中。我想也是这样。但我在控制台中运行它,当我运行该行时,它被提交。也许这个答案会对您有所帮助
device.car=nil
被提交到数据库,因为
HasOneAssociation
如何实现writer方法
car=
。无法从
设备
取消关联链接,因为创建链接的属性位于
汽车
中。您确定当Device.Car=nil行运行时,它会提交到数据库吗?它只会在您保存设备时提交到数据库,否则它会将nil值指定给设备对象,但不会在数据库中。我想也是这样。但我在控制台中运行它,当我运行该行时,它被提交。也许这个答案会对您有所帮助
device.car=nil
被提交到数据库,因为
HasOneAssociation
如何实现writer方法
car=
。无法取消关联与
设备的链接,因为创建链接的属性位于
汽车中。您好!最好给你的答案留个解释。嗨!最好给你的答案留个解释。