【问题标题】:Delayed Job: Apply unsaved ActiveRecord object to something else延迟作业:将未保存的 ActiveRecord 对象应用于其他对象
【发布时间】:2013-03-23 09:04:39
【问题描述】:

我正在尝试将未保存的 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,作业必须清理它(Things 真的不存在没有Person 附加),作业的调用者必须知道首先保存Thing,然后我们必须覆盖对Person 的验证检查。太可怕了。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 回复:“你不能先保存东西的原因是什么?”我不想再混淆这个问题了。我们只能说我们做不到。感谢您对不同模型的想法。不错。我会考虑一下。
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2018-04-11
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多