Ruby on rails Rails Activerecord:修补属于记录时出现404回滚事务错误
我有以下简化模型,以及使用Sqlite的rails项目中控制器中的一个操作 在我添加车库模型之前,汽车控制器中的更新操作一直运行良好。由于garage有很多车,而cars有一个garage,因此我在迁移中指定了外键关系,garage_id在cars表中 在模型中添加“has_many:cars”和“belish_to:garage”关系后,cars更新操作停止工作,出现“404回滚事务”错误。看来协会有点问题 如何指定模型之间的正确关系Ruby on rails Rails Activerecord:修补属于记录时出现404回滚事务错误,ruby-on-rails,sqlite,activerecord,Ruby On Rails,Sqlite,Activerecord,我有以下简化模型,以及使用Sqlite的rails项目中控制器中的一个操作 在我添加车库模型之前,汽车控制器中的更新操作一直运行良好。由于garage有很多车,而cars有一个garage,因此我在迁移中指定了外键关系,garage_id在cars表中 在模型中添加“has_many:cars”和“belish_to:garage”关系后,cars更新操作停止工作,出现“404回滚事务”错误。看来协会有点问题 如何指定模型之间的正确关系 class Garage < Application
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
class车库
从Rails 5开始,属于
默认情况下假定需要关联。每次尝试更新现有记录时,都会验证此操作
如果,正如您所建议的,车库
是一个新车型,您现有的汽车可能还没有指定车库。对汽车进行任何其他更改都将检查所有验证,包括检查是否有车库。如果您的汽车仍然没有,验证将失败,更新事务将回滚
如果要继续使用有效属于零或一个车库的车辆,可以将关联标记为可选:
belongs_to :garage, optional: true
如果您打算在将来某个时候要求将所有车辆分配到车库,则可以在更新所有车辆后删除可选
子句。或者,你可以咬紧牙关,坚持在你对所有汽车进行任何其他更改之前,将所有汽车分配到车库。这取决于您,您采取的行动过程将取决于您的用例
顺便说一句,在调用
@car.update
后,验证失败应该显示在@car.errors
中。如果您在将来遇到回滚,那永远是首先查看以了解发生了什么的最佳位置。尝试属于:garage,可选:true
。太好了!成功了。非常感谢。我真的无法理解那些在没有给出合理理由的情况下否决合法问题的人的心态。非常感谢你的详细解释。那真的很有帮助!