我正在尝试找到一种为计费应用程序设计一组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关系,这样一个层有很多客户端但也有很多个月。但现在检查会有两个父母,所以如何将两者结合起来呢?
答案 0 :(得分:2)
有趣的问题。这个答案可能无法准确回答您的需求,也许会遗漏一些重要细节,但我希望它可以帮助您。
如果您坚持一些基本规则,我认为您可以解决'月问题',例如:
这些规则可以帮助您避免在代码的其余部分中进行大量更新。如果您发现自己重新计算支票所在的等级月份,那么您做错了。此外,在每个记录中提供层级月份可以在更复杂的查询中提供巨大的优势。
在适当的模型(或服务对象)中为所有业务逻辑问题创建方法。此日历月中此客户的层级日期范围是多少?这个检查可以这样过时吗?不要只依赖验证,有时可以在另一个上下文中询问这些问题而不是保存操作,比如在渲染日历视图时。
关于与两位家长的查询。我不认为这是一个大问题。实质上,您只在大多数查询中创建额外的WHERE
子句。例如,您可以在具有before_filter
的控制器中解决该问题,该控制器可以获取(并可能授权)所需的客户端,月份和检查。这些before_filters只会在控制器之间略有不同。
我希望这会有所帮助。