【发布时间】:2018-11-08 17:10:30
【问题描述】:
我已经看到,在 Rails(至少 5.2.1)中,如果您的模型与另一个模型具有 has_one 关联,则会发生以下情况:
class Car < ApplicationRecord
has_one :steering_wheel
end
class SteeringWheel < ApplicationRecord
belongs_to :car
validate_presence_of :name
end
我有一个带有方向盘的现有汽车对象。然后我尝试像这样构建一个新的方向盘:
car.build_steering_wheel
我尝试构建的新方向盘无效,因为我没有设置名称属性。尽管如此,Rails 已经从数据库中删除了我现有的方向盘记录!我理解并依赖构建关联在构建新记录时删除现有记录,但在新记录无效时不会。
有人知道如何解决这个问题吗?我已经尝试在事务中回滚,独立创建方向盘记录,并且仅在 car.steering_wheel = 方向盘有效时才执行 .. 没有任何效果。
【问题讨论】:
-
为什么要新建一个?有的话可以更新吗?
-
确实如此。我这样做是因为控制器的编写方式是 form_tag 总是需要一个新记录。我可以重写控制器,以便它根据是新记录还是现有记录来处理创建或更新操作。
-
我猜这个问题在很大程度上是一个 X&Y 问题,而实际问题是您的表单或控制器完全错误。
-
不一定。如果新记录无效,build_associated 不应删除记录。
-
重写现有方法会是更好的选择。
标签: ruby-on-rails activerecord associations