所以我试着自学铁轨,并且弄清楚逻辑在哪里。 在我的练习中,我有一个付款模式。 班级 整数Product_Type String Product_name
有处理付款的规则 如果product_Type是物理的,那么执行此操作,如果是虚拟的话 如果product_name是book,请执行此操作 如果product_name是牛,那就这样做
我无法弄清楚这些规则在何处。 我是否在名为process的模型中创建了一个运行这些规则的方法?这是逻辑进入控制器吗?我只是不清楚这一点。
任何见解都将受到赞赏。
由于
答案 0 :(得分:6)
你绝对应该在模型中保留这个逻辑,事实上,如果不同类型的逻辑有很大不同,你应该使用具有单表继承的多个模型。
请参阅: http://joemcglynn.wordpress.com/2009/12/11/rails-sti-part-1/ http://joemcglynn.wordpress.com/2009/12/12/rails-single-table-inheritance-part-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
因此,通过这种方式,您可以创建一个类似于product.deliver
的方法,该方法在产品模型中默认定义,以触发产品的发送 - 但是在VirtualProduct模型中,将覆盖以触发通过电子邮件发送下载链接。
ActiveRecord非常好地处理所有这些(请参阅上面的链接文章进行演练),大多数表单,链接和控制器等将继续以他们当前的方式工作。
通常,您总是希望在模型中保留尽可能多的逻辑而不是控制器,因为模型更容易测试,更容易调试。在您的情况下,STI是一种很好的方式将模型中的分支逻辑保留在控制器和视图之外。
答案 1 :(得分:4)
首先,此列表为nice jumping off point。
我同意数据操作/业务规则最适合模型。保持视图和控制器清洁,以便您的模型可以包含所有存储结构和逻辑规则。
答案 2 :(得分:2)
通常,您需要模型中的业务逻辑。 “Fat Model,Skinny Controller”是用来描述这个的酷Rails短语。有关详细信息,请参阅此post,并且不要注意过时的Rails语法。