考虑Rails中的订单来建模库存

Mar*_*scó 7 postgresql activerecord ruby-on-rails calculated-columns

我正在使用Rails 5 开发一个租赁市场应用程序.它具有非常简单的结构,包括用户,产品和订单,以及属于用户的产品,他们实际创建它们.

为了让用户管理其产品的"实时"库存,已创建StockMovement模型/表,参考用户,库存变化(正/负)和日期.通过这种方式,我们可以根据"用户准备提供的内容"来确定特定日期的特定产品的库存.通过对单个表/模型的简单查询,我们设法获得股票的"总和",这恰好是产品的库存.

除此之外,我们需要考虑何时下订单并确认某个产品,导致需要在一段时间内从库存中减去该项目的数量.

目前,我们使用StockMovement模型中的查询计算股票,并使用StockMovement模型中的自定义select子句手动加入受订单影响的金额,该条款已经开始变得有点过分(我们甚至不是beta).

我的问题是,你将如何实现这种Rails方式?我总是遇到这样的情况,理论上,至少考虑到关系数据库逻辑(我们使用Postgres),最好的事情是使用带有连接和计算字段的查询动态计算所有内容,但是当涉及到使用ActiveRecord实现它,除非您在模型A的select语句中重新定义该计算,否则无法在对表A的查询中引用表B中的计算列,这正是我想要避免的.

到目前为止,我目前看到的选项是:

1-保持原样:在select语句中重复计算逻辑,以访问"外部计算字段"

2-每次确认订单时在StockMovement表中创建一条记录并从那里处理所有库存(不是理想的恕我直言,因为每次在订单中修改某些东西时都需要仔细更新)

3-我无法想到的潜在魔法(和正确)解决方案......

谢谢!

Pau*_*rth 4

就我个人而言,我认为将 SQL 与 ActiveRecord 混合Rails 的方式。关于 AR,我最喜欢的事情之一是:您可以在需要时注入原始 SQL。您甚至可以使用scopes将其包装在封装的、可重用的方法中。例如,您可以定义添加该列的范围select

您还可以创建一个名为每个产品一条记录的数据库视图current_stocks。让该视图查询stock_movementsorders计算当前库存,然后在需要该值时使用它。您甚至可以创建一个由视图支持的只读 ActiveRecord 类,以便您仍然可以使用常规关联、实例方法等。Rails 再次为您提供了一种使高级 SQL 功能与应用程序的其余部分良好配合的方法。

如果您每次都动态计算股票,最终您将遇到性能问题,因此您可以(1)将其设为物化视图并在后台定期刷新它,或者(2)current_stockproducts并保持最新。我可能会选择2。

或者,您可以 (3) 坚持使用即时计算,但添加一个starting_stocks表,为您提供“截至周日午夜的股票”值,这样您就不必计算太远的过去。我认为这可能是最好的方法,您可以推迟实施它,直到真正遇到问题为止。

如果您确实想深入研究,您可能需要阅读有关时态数据库的内容。两本好书是Richard Snodgrass 的《用SQL 开发面向时间的数据库应用程序》和 Tom Johnston 的《双时态数据》。前者还可以从作者的网站上以免费 PDF 形式获取。我猜现在这对你来说有点过分了,但了解它仍然是一件很棒的事情。