gpt4 book ai didi

ruby - 检查 DataMapper(或其他 ORM)模型是否持久化

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:10 24 4
gpt4 key购买 nike

我发现自己开始利用检查持久性来让我的模型“工作”。包含持久性检查似乎方便且正确。另一方面,感觉有点阴暗,好像我过于谨慎或以一种小的方式破坏了 ORM 抽象。

一个例子可能是:

class Shipment
include DataMapper:Resource

belongs_to :address, :required => false

def shippable?
valid? && persisted? && !address.nil? && address.valid? && address.persisted?
end
end

在这种情况下,我需要一个方法来告诉我 cargo 是否可以发货。当它有效、保存到数据库并保存地址时,这是真的。

另一个例子可能是在回调中使用它来确定某些事情(价格重新计算)是否需要发生。

此代码安全且正确吗?

最佳答案

好吧,如果您真的有可能在没有确认持久性或从数据库重新加载的情况下执行装运,那么检查持久性对我来说似乎是绝对必要的。

但是真的是这样吗?您如何进行此运输操作?我会在这里想到两个工作流程:

  1. 有一个您要发货的订单。你点击“发送这个狗屎!”并转到 ShipmentsController#new,输入您的数据。通过按“保存”,您的货件将得到验证并保留(如果有效)。持久化成功后(我假设 shipment.save 返回 false 如果没有),您可以直接继续您的运输操作(无论在那里需要做什么)。如果 shipment.save 告诉您它没有持续存在,则 #new View 将在另一次呈现并且尚未执行运输。所以这就是类似向导的工作流的想法,它带有一个“”,只有在持久化成功的情况下,您才能执行运送。

  2. 装运的创建和装运的装运完全分离。假设一个人计划发货,另一个人执行。前者创建一个新的、有效的、持久的装运。后者以准备好的发货 list 开始。此 ShipmentsController#index 使用 Shipment.all 直接从数据库加载 cargo 。无需在 ShipmentsController#perform 操作中检查 persisted?

好的。让我们让它更复杂:假设现在我们在场景 2 中,第一个人可以删除 cargo ,而第二个人执行它。如果不考虑这种情况,天真的应用程序会在 #perform 完成后再次保存装运,设置装运日期。这将意味着发生了丢失“删除” 数据库异常。但是,无论如何您都不会使用状态机吗?因此,假设存在已计划 -> 已删除已计划 -> 已发货 转换。如果 #1 将状态设置为 deleted 而 guy#2 正在执行装运,状态机将抛出异常:“亲爱的,没有从 deleted 到 shpped 的转换!” 在尝试更新状态时。

所以我无法真正编造一个显式检查持久性不是偏执的场景。但是,如果由于“不安全”的工作流程而确实可能发生这种情况,您应该检查持久性。

关于ruby - 检查 DataMapper(或其他 ORM)模型是否持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com