代码之家  ›  专栏  ›  技术社区  ›  Sean Magyar

Rails首选的方法是在child上将foreign\u key设置为nil

  •  0
  • Sean Magyar  · 技术社区  · 5 年前

    我有一个 has_one Device Car .

    你最喜欢的方法是什么 ActiveRecord device_id 一点也没有 car 但不删除 汽车 本身)?

    device.car = nil

    我知道我也可以查一下 ,设置 dongle_id nil 省省吧,但这次行动是为了 device .

    突变:

    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
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   lbhise    5 年前

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

    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
    
        2
  •  1
  •   Yuri Afanasyev    5 年前
    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