1

我正在尝试将未保存的 ActiveRecord 对象应用于已保存对象Thing的数组Person

person has_many :things

但延迟作业不适用于未保存的 ActiveRecord 模型。我知道,因为他们告诉我:

DJ 不适用于未保存的 ActiveRecord 模型。

https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-DJ_doesnt_deserialize_an_unsaved_ActiveRecord_model

...所以我无法绕过错误:

{ActiveRecord::RecordNotFound, class: Thing , primary key:

我一直在尝试一些策略来解决它:

1) 从这里覆盖 self.yaml_new 。听起来是个可怕的主意。

2)覆盖Thing.find以从未找到中恢复并仅水合未保存的对象。这是一个比#1更糟糕的主意

3)先保存Thing到数据库。坏主意,因为我们将Thing在数据库中有一个孤儿,作业必须清理(Thing没有附加的 s 真的不存在Person),作业的调用者必须知道保存第Thing一个,我们将拥有覆盖验证检查Person。可怕。

4) 创建Thing.to_open_struct将 AR 详细信息转储到 OpenStruct 以进行 DJ 序列化的方法。有点乱 需要使该方法与任何迁移保持同步。不理想,但这是我迄今为止最好的。

有任何想法吗?我没有设置 DJ 序列化未保存的Thing我只是想要一个干净的解决方案。

4

1 回答 1

2

一个想法是创建一个名为 UnsavedThing 的新表/模型,它没有任何关联,但与 Thing 基本相同。

DJ 找到一个 UnsavedThing,用它调用 Thing.new,用它做一些事情,调用 Thing.save,然后调用 UnsavedThing.destroy。

不是那么优雅,但替代品也不是很好。

你不能先保存东西的原因是什么?如果您可以提供更多关于类如何交互的上下文以及何时可以保存 Thing 的标准,则可能会有更好的解决方案。

于 2013-03-23T00:47:27.400 回答