学习基本轨道:在哪里放置条件业务逻辑?

MFD*_*000 1 ruby model-view-controller ruby-on-rails ruby-on-rails-3

因此,我试图自学铁路,并在弄清楚逻辑在哪里时遇到一些麻烦.在我的练习中,我有一个付款模式.class pyament Integer Product_Type String Product_name

如果product_Type是物理的,则有处理付款的规则,执行此操作,如果product_name是book,则执行此操作,如果product_name是cow,请执行此操作,执行此操作

我无法弄清楚的是在哪里制定这些规则.我是否在名为process的模型中创建了一个运行这些规则的方法?这是逻辑进入控制器吗?我只是不清楚这一点.

任何见解将不胜感激.

谢谢

And*_*rew 6

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

请参阅:http : //joemcglynn.wordpress.com/2009/12/11/rails-sti-part-1/ http://joemcglynn.wordpress.com/2009/12/12/rails-single-table-inheritance-第2部分/

基本上这个想法是这样的:你已经定义了产品类型 - 'type'列是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
Run Code Online (Sandbox Code Playgroud)

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

ActiveRecord非常好地处理所有这些(请参阅上面的链接文章进行演练),大多数表单,链接和控制器等将继续以他们当前的方式工作.

通常,您总是希望在模型中保留尽可能多的逻辑而不是控制器,因为模型更容易测试,更容易调试.在您的情况下,STI是一种很好的方法,可以将模块中的分支逻辑保留在控制器和视图之外.