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的模型中创建了一个运行这些规则的方法?这是逻辑进入控制器吗?我只是不清楚这一点.
任何见解将不胜感激.
谢谢
您应该将此逻辑保留在模型中,事实上,如果不同类型之间的逻辑存在显着差异,则应使用具有单表继承的多个模型.
请参阅: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是一种很好的方法,可以将模块中的分支逻辑保留在控制器和视图之外.
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |