延迟作业:将未保存的ActiveRecord对象应用于其他内容

时间:2013-03-22 13:41:36

标签: ruby-on-rails activerecord delayed-job

我正在尝试将未保存的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)从here覆盖self.yaml_new。听起来像个糟糕的主意。

2)覆盖Thing.find以从未找到的地方恢复并仅保湿未保存的物体。这比#1

更糟糕

3)首先将Thing保存到数据库。糟糕的想法,因为我们将在数据库中有一个孤立Thing,而作业将不得不清理(Thing在没有附加Person的情况下确实不存在),调用者是工作必须先知道保存Thing,我们必须覆盖检查Person的验证。可怕。

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

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

1 个答案:

答案 0 :(得分:2)

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

DJ找到一个UnsavedThing,用它来调用Thing.new,用它做东西,调用Thing.save,然后调用UnsavedThing.destroy。

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

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