【问题标题】:Rails Activerecord: Getting 404 rollback transaction error when patching belongs_to recordRails Activerecord:修补belongs_to记录时出现404回滚事务错误
【发布时间】:2018-10-04 08:47:51
【问题描述】:

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

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

在模型中添加“has_many :cars”和“belongs_to:garage”关系后,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

【问题讨论】:

  • 试试belongs_to: garage, optional: true
  • 太棒了!有效。非常感谢。
  • 我真的无法理解那些在没有给出一些正当理由的情况下对合法问题投反对票的人的心态。

标签: ruby-on-rails sqlite activerecord


【解决方案1】:

从 Rails 5 开始,belongs_to 关联被认为是默认需要的。这将在您每次尝试更新现有记录时进行验证。

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

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

belongs_to :garage, optional: true

如果您打算在未来某个时间点将所有汽车分配到车库,则可以在所有汽车更新后删除optional 子句。或者,您可以硬着头皮坚持将所有汽车分配到车库,然后才能对它们进行任何其他更改。这取决于您,您采取的行动将取决于您的用例。

顺便提一下,在您调用@car.update 之后,验证失败应该会显示在@car.errors 中。如果您将来遇到回滚,那总是最好先查看以了解发生了什么。

【讨论】:

  • 非常感谢您的详细解释。这真的很有帮助!
猜你喜欢
  • 2013-12-04
  • 2016-04-19
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多