Ruby on rails 学习基本rails:将条件业务逻辑放在哪里?

Ruby on rails 学习基本rails:将条件业务逻辑放在哪里?,ruby-on-rails,ruby,ruby-on-rails-3,model-view-controller,Ruby On Rails,Ruby,Ruby On Rails 3,Model View Controller,所以我试着自学rails,但在弄清楚逻辑走向方面遇到了一些困难。 在我的练习中,我有一个付款模式。 pyament类 整数乘积型 字符串产品名称 有处理付款的规则 如果产品类型为物理,则执行此操作,如果为虚拟,则执行该操作 如果产品名称为book,请执行此操作 如果产品名称为cow,请执行此操作 我不知道该把这些规则放在哪里。 我是否在模型中创建了一个名为process的方法来运行这些规则?该go逻辑是否进入控制器?我只是不清楚这一点 如有任何见解,将不胜感激 谢谢通常,您希望您的业务逻辑出现在

所以我试着自学rails,但在弄清楚逻辑走向方面遇到了一些困难。 在我的练习中,我有一个付款模式。 pyament类 整数乘积型 字符串产品名称

有处理付款的规则 如果产品类型为物理,则执行此操作,如果为虚拟,则执行该操作 如果产品名称为book,请执行此操作 如果产品名称为cow,请执行此操作

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

如有任何见解,将不胜感激


谢谢

通常,您希望您的业务逻辑出现在模型中。“胖模特,瘦控制器”是Rails用来描述这一点的酷词。更多信息,请参阅本页,不要注意过时的Rails语法。

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

对于初学者,此列表是一个示例


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

对于初学者,此列表是一个简单的列表


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

您肯定应该在模型中保留此逻辑,事实上,如果不同类型之间的逻辑明显不同,您应该使用具有单表继承的多个模型

见:

基本上是这样的:您已经定义了产品类型——“类型”列是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是一种很好的方法,可以将模型中的分支逻辑保留在控制器和视图之外。

您肯定应该将此逻辑保留在模型中,事实上,如果不同类型之间的逻辑明显不同,则应该使用具有单表继承的多个模型

见:

基本上是这样的:您已经定义了产品类型——“类型”列是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是将模型中的分支逻辑保留在控制器和视图之外的好方法。

好的,我可以这样做。谢谢,我想下一个问题是。如果我在我的支付模型中创建了一个流程方法,并且如果它符合我的条件之一,我需要调用函数CreateReceipt,那么我应该将CreateReceipt函数放在哪里?同样的付款方式?好的,我同意。谢谢,我想下一个问题是。如果我在我的支付模型中创建了一个流程方法,并且如果它符合我的条件之一,我需要调用函数CreateReceipt,那么我应该将CreateReceipt函数放在哪里?在相同的支付模式下?我完全支持fat模式的概念。我的问题是。随着我的业务规则随着时间的推移而扩展,我想我不应该一直将它们添加到模型中的流程方法中。随着规则数量的增加,还有什么地方可以遵守吗?老实说,有时候你会遇到真正肥胖的模特。这并不理想,但也有可能发生。使用STI分解相关功能将有所帮助。另一件需要考虑的事情是“德米特定律”(the Law of Demeter)()——在您的模型中是否有函数真正处理单独的关系