Rails Activerecord: ошибка транзакции отката 404 при исправлении записи own_to - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующие упрощенные модели и действие в контроллере в проекте rails с использованием Sqlite.

Действие обновления в контроллере автомобилей работало нормально, пока я не добавил модель гаража.Так как в гараже много автомобилей, а в автомобилях один гараж, я указал в ключе отношения с внешним ключом, где параметр garage_id указан в таблице cars.

После добавления отношений has_many: cars и Газеты "own_to: garage" вмодели, действие # update автомобилей перестало работать с ошибкой «откат транзакции 404».Кажется, есть некоторые проблемы с ассоциациями.

Как указать правильные отношения между моделями?

class Garage < ApplicationRecord
  has_many :cars
end

class User < ApplicationRecord
  has_many :cars
end

class Car < ApplicationRecord
  # car table has building_id as foreign key
  belongs_to :garage
  belongs_to :user
  has_one :option
end

class Option < ApplicationRecord
  # option table has car_id as foreign key
  belongs_to :car
end

class CarsController < ApplicationController
  def update
    @car.update(params[:color])
    @option.update(params[:seat])
    # getting "404 rolling back transaction" error.
  end
end

1 Ответ

0 голосов
/ 04 октября 2018

Начиная с Rails 5, belongs_to ассоциации, как предполагается, требуются по умолчанию.Это будет проверяться каждый раз, когда вы пытаетесь обновить существующую запись.

Если, как вы предлагаете, Garage - это новая модель, вероятно, вашим существующим автомобилям еще не присвоен гараж.Внесение любых других изменений в автомобиль проверит все проверки, включая проверку наличия гаража.Если в вашем автомобиле его еще нет, проверка завершится неудачно, а транзакция обновления откатится.

Если вы хотите продолжить работу с автомобилями, действительно принадлежащими нулю или одному гаражу, выможете пометить ассоциацию как необязательную:

belongs_to :garage, optional: true

Если вы собираетесь требовать, чтобы все автомобили были назначены в гараж в какой-то момент в будущем, вы можете удалить предложение optional после обновления всех автомобилей.,Или вы можете прикусить пулю и настаивать на том, чтобы все машины были переданы в гаражи, прежде чем вы сможете вносить в них другие изменения.Это зависит от вас, и ваши действия будут зависеть от вашего варианта использования.

Кстати, ошибка проверки должна появиться в @car.errors после того, как вы позвоните @car.update.Если вы получаете откат в будущем, это всегда лучшее место, чтобы сначала посмотреть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...