0

我正在尝试找到一种方法来为计费应用程序设计一组 Rails 关系。它适用于从保险公司或付款人那里收到支票的供应商,然后将付款转发给他们的客户。

供应商按月平衡支票和付款,并根据该月内的活动向客户发送报告。

然而,“月”并不直接对应于日历月。取而代之的是,客户是按层交错的,因此报告并非都在每月的同一天到期。例如,在 1 月份,第 1 层客户的活动可能定义为 1 月 1 日至 1 月 31 日,第 2 层客户的活动定义为 1 月 7 日至 2 月 6 日,依此类推。

正好有3层。

每一层都有许多客户。

一个客户有很多支票。

到目前为止,如此简单。

我只是不知道如何有效地管理月份:

一张支票有一个存款日期,在该日期之前它将属于一个特定的“月份”。月份也必然由支票客户的等级决定。

由于存在三层,因此应该有三个“2013 年 1 月”月,每个月都有不同的开始和结束日期,但“月-年”和层的唯一性应该经过验证,使得第 1 层恰好有一个“一月” 2013 年,以此类推。

我希望路由使用户可以导航到clients_path,选择一个客户端,选择一个月份,然后创建一个新的检查,以便检查知道它属于哪个月份和客户端,例如我不能创建存款日期超出 client_month_path 定义的范围的新支票。

我认为我遇到的错误可能在于将每个模型定义为具有 has_many 或 belongs_to 关系,这样一个层就有很多客户,但也有很多个月。但是现在一张支票会有两个父母,那么我该如何将两者结合起来呢?

4

1 回答 1

2

有趣的问题。这个答案可能无法为您的需求提供准确的答案,并且可能遗漏了一些关键细节,但我希望它可以帮助您。

如果你坚持一些基本规则,我认为你可以解决“月问题”,比如:

  1. 明确区分实际日历日期和等级月份。永远不要只将一个日期传递给某个服务方法或视图,始终传递两个。所以:
  2. 在每个必要的检查/记录中存储实际日期和层月份。一个是日期,另一个是一个月。您可能还希望存储 tier_id(如果存在)。
  3. 仅在实际日期属性更改时更新层月属性。层月始终根据某些客户端设置进行计算和验证。这是在您的模型中的某个地方完成的,没有其他地方。

这些规则将使您免于在其余代码中进行大量日期改组。如果您发现自己重新计算支票所在的月份,那么您做错了。此外,在每条记录中都有可用的层月在更复杂的查询中提供了巨大的优势。

在适当的模型(或服务对象)中为所有这些业务逻辑问题创建方法。该客户在本日历月的等级日期范围是多少?这张支票可以这样注明日期吗?不要只依赖验证,有时在保存操作之外的其他上下文中提出这些问题很好,比如在渲染日历视图时。

关于与两位家长的疑问。我不认为这是一个大问题。本质上,您只需WHERE在大多数查询上创建一个额外的子句。例如,您可以在一个控制器中解决这个问题,该控制器before_filter获取(并且可能授权)所需的客户端、月份和检查。这些 before_filters 在控制器之间只会略有不同。

我希望这会有所帮助。

于 2013-10-31T19:53:30.567 回答