ActiveRecord#save:`retry` 中断 "autosave" 关联
ActiveRecord#save: `retry` breaks "autosave" for associations
我在 ActiveRecord 模型上覆盖 save
以处理边缘情况:
class A < ActiveRecord::Base
belongs_to :b
def save *args
super
rescue ActiveRecord::StatementInvalid => ex
log_warning
retry unless @foo
throw ex
end
end
a = A.new
a.build_b
a.save
而且我发现当 save
函数第二次执行时(因为 retry
),我得到一个与相关记录 [=15] 有关的 MySQL 错误=]:
ActiveRecord::StatementInvalid: Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO bs
VALUES ()
使用断点我可以看到在 retry
之后,对 b
的 ActiveRecord#_create_record
(see source) 的调用有一个空数组 ([]
) 对于要保存的属性,而在第一次调用时它是 ["full_name","company","id","owner_id","created_at","updated_at"]
。
为什么 retry
打破了关联记录的自动保存?我该怎么办?
上面的 link 适用于 ActiveRecord 4.2.11.3,这是我正在工作的项目的版本。
如果我是你,我不会覆盖保存方法。
我宁愿使用 around_save
回调。
class A < ActiveRecord::Base
around_save :saving_retry
def saving_retry
yield
rescue ActiveRecord::StatementInvalid => ex
log_warning
save unless @foo
end
end
我在 ActiveRecord 模型上覆盖 save
以处理边缘情况:
class A < ActiveRecord::Base
belongs_to :b
def save *args
super
rescue ActiveRecord::StatementInvalid => ex
log_warning
retry unless @foo
throw ex
end
end
a = A.new
a.build_b
a.save
而且我发现当 save
函数第二次执行时(因为 retry
),我得到一个与相关记录 [=15] 有关的 MySQL 错误=]:
ActiveRecord::StatementInvalid: Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO
bs
VALUES ()
使用断点我可以看到在 retry
之后,对 b
的 ActiveRecord#_create_record
(see source) 的调用有一个空数组 ([]
) 对于要保存的属性,而在第一次调用时它是 ["full_name","company","id","owner_id","created_at","updated_at"]
。
为什么 retry
打破了关联记录的自动保存?我该怎么办?
上面的 link 适用于 ActiveRecord 4.2.11.3,这是我正在工作的项目的版本。
如果我是你,我不会覆盖保存方法。
我宁愿使用 around_save
回调。
class A < ActiveRecord::Base
around_save :saving_retry
def saving_retry
yield
rescue ActiveRecord::StatementInvalid => ex
log_warning
save unless @foo
end
end