ruby-on-rails - 学习基础 rails : Where to put conditional business logic?

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

所以我试图自学 Rails,但在弄清楚逻辑走向时遇到了一些麻烦。 在我的练习中,我有一个支付模型。 类(Class)广场 整数 Product_Type 字符串产品名称

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

我想不通的是将这些规则放在哪里。 我是否在模型中创建了一个名为 process 的方法来运行这些规则?这个 go 逻辑是否进入 Controller ?我只是不清楚。

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

谢谢

最佳答案

你绝对应该在模型中保留这个逻辑,事实上,如果不同类型之间的逻辑明显不同,你应该使用具有单表继承的多个模型。

参见: http://joemcglynn.wordpress.com/2009/12/11/rails-sti-part-1/ http://joemcglynn.wordpress.com/2009/12/12/rails-single-table-inheritance-part-2/

基本上这个想法是这样的:您已经定义了产品类型——“类型”列是 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 可以很好地处理所有这些(请参阅上面的链接文章以了解演练),并且您的大部分表单、链接和 Controller 等将继续以与当前相同的方式工作。

通常,您总是希望在模型而不是 Controller 中保留尽可能多的逻辑,因为模型更易于测试和调试。在您的情况下,STI 是一种不错的方法将这种分支逻辑保留在模型中,而不是 Controller 和 View 中。

关于ruby-on-rails - 学习基础 rails : Where to put conditional business logic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687991/

相关文章:

ruby-on-rails - Ruby Integer()、Array() 等——它们是什么?他们来自哪里?

ruby-on-rails - 上传图片 Ruby on Rails

ruby - Nokogiri 可以保留属性引用风格吗?

ruby - 从字符串中获取前 N 个字符而不剪切整个单词

ruby-on-rails - rails : How to validate format only if value is present?

mysql - 属性神秘地设置为 1 的 id

ruby-on-rails - 从 Rails 模型中访问 c​​urrent_user?

ruby-on-rails-3 - Rails Twitter OAuth 策略与 Devise

ruby - 通过 ruby​​ 脚本设计身份验证

ruby-on-rails - 使用 Capistrano 部署时将静态文件保存在服务器中