用多个父母描述资源

时间:2013-10-31 19:06:32

标签: ruby-on-rails ruby-on-rails-4

我正在尝试找到一种为计费应用程序设计一组rails关系的方法。供应商从保险公司或付款人处获得支票,然后将付款转发给客户。

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

然而,“月份”并不直接对应于日历月。相反,客户端分层交错,因此报告并非全部在同一天到期。例如,在1月份,第1级客户可能将其活动定义为1月1日至1月31日,第2层定义为1月7日至2月06日,依此类推。

正好有3层。

每个层都有很多客户。

客户有很多支票。

到目前为止,非常简单。

我无法弄清楚如何有效地管理月份:

支票有一个存款日期,它将属于特定的“月份”。月份也必须由支票的客户层级确定。

由于有三层,因此应该有三个'2013年1月'月,每个月都有不同的开始和结束日期,但是应该验证'月 - 年'和层的唯一性,以便第1层具有确切的一个'2013年1月',等等。

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

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

1 个答案:

答案 0 :(得分:2)

有趣的问题。这个答案可能无法准确回答您的需求,也许会遗漏一些重要细节,但我希望它可以帮助您。

如果您坚持一些基本规则,我认为您可以解决'月问题',例如:

  1. 明确区分实际日历日期和等级月份。永远不要将一个日期传递给某个服务方法或视图,始终传递两者。因此:
  2. 将实际日期和等级月份存储在每个必要的检查/记录中。一个是约会,另一个是月份。您可能还希望存储tier_id(如果存在)。
  3. 仅在实际日期属性更改时更新层级月份属性。始终根据某些客户端设置计算和验证层级月份。这是在您的模型中的某个地方完成的,而不是其他地方。
  4. 这些规则可以帮助您避免在代码的其余部分中进行大量更新。如果您发现自己重新计算支票所在的等级月份,那么您做错了。此外,在每个记录中提供层级月份可以在更复杂的查询中提供巨大的优势。

    在适当的模型(或服务对象)中为所有业务逻辑问题创建方法。此日历月中此客户的层级日期范围是多少?这个检查可以这样过时吗?不要只依赖验证,有时可以在另一个上下文中询问这些问题而不是保存操作,比如在渲染日历视图时。

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

    我希望这会有所帮助。