**已关闭。**此问题需要debugging details。它目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
上个月关门了。
Improve this question
我正在将Rails 3应用程序升级到Rails 5版本。我有一个属于协会的会员。我正在交易块中保存记录。在Rails 5中,我观察到,如果事务被回滚,则空数据被插入到“tasks”表中。在轨道3的情况下,这不会发生。这是Rails 5中的预期行为吗?我不想破坏现有的功能,所以有办法在Rails 5中保留Rails 3的行为吗?
下面是生成此问题的示例代码。
class Student < ApplicationRecord
has_one :task
end
class Task < ApplicationRecord
belongs_to :student
validates_presence_of :name
end
student = Student.first
student.name = nil
def student.testing
begin
ActiveRecord::Base.transaction do
t = Task.new
t.name = 'ddd'
t.student = self
t.save!
puts "raising exception"
raise "exception"
end
rescue => e
end
end
student.testing
student.save!
2条答案
按热度按时间ijxebb2r1#
从这个例子中,我只能找出一个问题,那就是rails如何检测
inverse_of
的关联。有一个
由于inverse_of已设置,因此当您将
student
分配给task.student
时,逆值也会被分配给-student.task
:如果你回滚任务事务,对象仍然被分配给
student.task
,并且当父对象被保存时,新的关联被保存。这是完全相同的事情:无逆
与
has_many
相同:多
与逆
qgelzfjb2#
假设“belongs_to表”是
students
(为什么不直接说“students”或“tasks”呢?)那么是的,您显示的代码应该会导致“null data”被保存到students
表中。不知道为什么你会认为围绕
Task#save!
代码的回滚事务块会影响student.name = nil; student.save!
代码?