Ruby on rails Rails Activerecord:修补属于记录时出现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

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

在我添加车库模型之前,汽车控制器中的更新操作一直运行良好。由于garage有很多车,而cars有一个garage,因此我在迁移中指定了外键关系,garage_id在cars表中

在模型中添加“has_many:cars”和“belish_to:garage”关系后,cars更新操作停止工作,出现“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
class车库
从Rails 5开始,
属于
默认情况下假定需要关联。每次尝试更新现有记录时,都会验证此操作

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

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

belongs_to :garage, optional: true
如果您打算在将来某个时候要求将所有车辆分配到车库,则可以在更新所有车辆后删除
可选
子句。或者,你可以咬紧牙关,坚持在你对所有汽车进行任何其他更改之前,将所有汽车分配到车库。这取决于您,您采取的行动过程将取决于您的用例


顺便说一句,在调用
@car.update
后,验证失败应该显示在
@car.errors
中。如果您在将来遇到回滚,那永远是首先查看以了解发生了什么的最佳位置。

尝试
属于:garage,可选:true
。太好了!成功了。非常感谢。我真的无法理解那些在没有给出合理理由的情况下否决合法问题的人的心态。非常感谢你的详细解释。那真的很有帮助!