【问题标题】:Learning Basic rails: Where to put conditional business logic?Learning Basic rails:条件业务逻辑放在哪里?
【发布时间】:2011-10-05 00:06:02
【问题描述】:

所以我试图自学 Rails,但在弄清楚逻辑的走向时遇到了一些麻烦。 在我的练习中,我有一个支付模式。 班期 整数积_类型 字符串产品名称

有处理付款的规则 如果 product_Type 是物理的,请执行此操作,如果是虚拟的,请执行此操作 如果 product_name 是 book,请执行此操作 如果product_name 是cow,就这样做

我不知道在哪里放置这些规则。 我是否在模型中创建了一个名为 process 的方法来运行这些规则?这个 go 逻辑是否进入控制器?我只是不清楚这一点。

任何见解将不胜感激。

谢谢

【问题讨论】:

  • 我完全赞成胖模型的概念。我的问题是。随着我的业务规则随着时间的推移而扩展,我猜我不应该只是继续将它们添加到我的模型内部的流程方法中。随着数量的增加,规则是否还有位置?
  • 老实说,有时你会得到非常胖的模特。这并不理想,但它可能会发生。使用 STI 分解相关功能会有所帮助。要考虑的另一件事是“得墨忒耳法则”(en.wikipedia.org/wiki/…)——您的模型中是否有真正处理单独资源问题的函数?把它们分开。还要寻找平凡的东西,而不是特定于您的模型,并将它们提取到您自己的模块或宝石中。这些东西可以防止胖模特变胖。

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller


【解决方案1】:

通常您希望模型中的业务逻辑。 “胖模型,瘦控制器”是用来描述这一点的酷 Rails 短语。请参阅此post 了解更多信息,不要关注过时的 Rails 语法。

【讨论】:

  • 好的,我可以接受。谢谢,我想下一个问题是。如果我在我的支付模型中创建了一个流程方法,并且如果它满足我的条件之一,我需要调用一个函数 CreateReceipt,我应该将 createReceipt 函数放在哪里?在相同的付款模式下?
【解决方案2】:

对于初学者,此列表是nice jumping off point

我同意数据操作/业务规则最适合模型。保持视图和控制器干净,以便您的模型可以包含所有存储结构和逻辑规则。

【讨论】:

    【解决方案3】:

    你绝对应该在模型中保留这个逻辑,事实上,如果不同类型之间的逻辑有显着差异,你应该使用具有单表继承的多个模型。

    见: http://joemcglynn.wordpress.com/2009/12/11/rails-sti-part-1/ http://joemcglynn.wordpress.com/2009/12/12/rails-single-table-inheritance-part-2/

    基本上这个想法是这样的:您已经在定义产品类型——“类型”列是 STI 表的主要特征。

    使用 STI,而不是拥有一个具有大量条件逻辑或多个模型的模型,您可以拥有多个非常相似的模型,这些模型具有非常相似的数据但逻辑有所不同,因此所有这些相关的模型都可以共享同一个表,并继承自一个普通的类。

    例如:

    class Product < ActiveRecord::Base
      ...
      common logic goes here
      ...
    end
    
    class PhysicalProduct < Product
      ...
      physical-product-specific logic goes here
      ...
    end
    
    class VirtualProduct < Product
      ...
      virtual-product-specific logic goes here
      ...
    end
    

    因此,通过这种方式,您可以创建像 product.deliver 这样的方法,该方法在产品模型中默认定义以触发产品发货 - 但在 VirtualProduct 模型中被覆盖以触发通过电子邮件发送下载链接。

    ActiveRecord 可以很好地处理所有这些(有关演练,请参阅上面链接的文章),并且您的大多数表单、链接和控制器等将继续以与当前相同的方式工作。

    一般来说,您总是希望在模型而不是控制器中保留尽可能多的逻辑,因为模型更容易测试,也更容易调试。在您的情况下,STI 是一种不错的方法将模型中的这种分支逻辑保持在控制器和视图之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 2011-08-02
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      相关资源
      最近更新 更多