Rails предпочитает способ установки foreign_key для nil для дочернего элемента - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть has_one отношение с Device и Car.

Какой предпочтительный способ с ActiveRecord для удаления ребенка от родителя (установка device_id nil на car но НЕ удаляя саму car)?

Когда запускается строка device.car = nil, она немедленно фиксируется в базе данных.Я хочу, чтобы он был зафиксирован только при сохранении и возвращал некоторую полезную ошибку, если он не был сохранен.

Я знаю, что я мог бы также попытаться найти car, установить dongle_id в nilи сохраните это, но это действие скорее о мутации device, чем 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

модели:

class Device < ApplicationRecord
  has_one :car
end

class Car < ApplicationRecord
  belongs_to :device
end

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018
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
0 голосов
/ 05 декабря 2018

Попробовав разные способы, я обнаружил, что приведенный ниже код работает должным образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...