Rails Activerecord:修补belongs_to记录时出现 404 回滚事务错误



我有以下简化的模型,以及使用Sqlite的rails项目中控制器中的操作。

在我添加车库模型之前,汽车控制器中的更新操作工作正常。由于车库有许多汽车,而汽车有一个车库,因此我在迁移中指定了一个外键关系,garage_id在 cars 表中。

在模型中添加"has_many:cars"和"belongs_to:车库"关系后,cars#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

从 Rails 5 开始,默认情况下假定需要belongs_to关联。每次尝试更新现有记录时,都会验证这一点。

如果,正如你所建议的,Garage是新车型,你现有的汽车可能还没有分配车库。对汽车进行任何其他更改将检查所有验证,包括检查是否存在车库。如果您的汽车仍然没有,验证将失败,更新事务将回滚。

如果要继续使用有效属于零个或一个车库的汽车,可以将关联标记为可选:

belongs_to :garage, optional: true

如果您打算要求在将来的某个时候将所有汽车分配到车库,则可以在更新所有汽车后删除optional子句。或者,您可以咬紧牙关,坚持将所有汽车分配给车库,然后才能对其进行任何其他更改。这取决于您,您采取的行动方案将取决于您的使用案例。

顺便说一下,验证失败应该显示在@car.errors调用@car.update后。如果将来出现回滚,这始终是首先查看以了解正在发生的事情的最佳位置。

相关内容

  • 没有找到相关文章

最新更新