我正在尝试将未保存的ActiveRecord对象Thing
应用于已保存对象Person
的数组。
person has_many :things
但延迟作业不适用于未保存的ActiveRecord模型。我知道,因为他们告诉我:
DJ无意使用未保存的ActiveRecord模型。
...所以我无法解决错误:
{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
我只想要一个干净的解决方案。
答案 0 :(得分:2)
一个想法是创建一个名为UnsavedThing的新表/模型,它没有任何关联,但与Thing基本相同。
DJ找到一个UnsavedThing,用它来调用Thing.new,用它做东西,调用Thing.save,然后调用UnsavedThing.destroy。
不是那么优雅,但替代方案也不是很好。
你不能先保存东西的原因是什么?如果您可以提供有关类如何交互的更多上下文以及何时可以保存Thing的条件,则可能有更好的解决方案。