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

时间:2011-07-14 02:57:57

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

所以我试着自学铁轨,并且弄清楚逻辑在哪里。 在我的练习中,我有一个付款模式。 班级  整数Product_Type  String Product_name

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

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

任何见解都将受到赞赏。

由于

3 个答案:

答案 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语法。