【问题标题】:How do you perform calculations on multiple Rails models, and where should the logic go?你如何在多个 Rails 模型上执行计算,逻辑应该去哪里?
【发布时间】:2012-03-02 09:55:40
【问题描述】:

我在 Rails 应用中有一个 Invoice 模型。发票 has_many 产品和服务(两个独立的模型)。发票显示视图​​显示这些关联的记录。

产品和服务都具有相似的结构,即项目、价格、数量。我可以将行总计计算为price * quantity,我可以将产品的总价格计算为all.collect { |product| product.price * product.quantity },服务也是如此。

如果我现在想计算这张发票上的产品 + 服务的总成本怎么办?

如何跨多个模型执行计算?以及计算逻辑应该去哪里?

我意识到一种解决方案是将产品和服务组合到一个模型中,但这不是一个选项。

我不知道从哪里开始,非常感谢一些指针、想法或有用文档的链接。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    只是为了检查:

    • 发票有_许多产品和服务
    • 产品有一个 total_cost 方法(或 total_price)
    • Services 也有一个 total_cost 方法

    并且您正在询问将发票的产品和服务总价格的逻辑放在哪里。对吗?

    在这种情况下,你把它放在 Invoice 中是正确的:

    def total_cost_of_products
      products.collect { |product| product.price * product.quantity }
    end
    
    def total_cost_of_services
      services.collect { |services| service.price * service.quantity }
    end
    
    def total_price_of_products_and_services
      total_cost_of_products + total_cost_of_services
    end
    

    当然,您可以多干一些,而且您可能需要对发票模型进行一些单元测试。请参阅 lucapette 的答案,了解重构和干燥它的好方法

    【讨论】:

    • 谢谢@corroded,我曾尝试做类似的事情,但它返回了奇怪的结果。也许这是因为我的价格存储为小数而不是整数?在进行小数计算时有什么需要注意的问题吗?
    • 现在我仔细查看了这个,计算是连接而不是总和 total_cost_of_products 和 total_cost_of_services。我做错了吗?
    • 如果它是连接的,那么你的值就会以某种方式作为字符串。我认为这值得在这里提出另一个问题,因为它似乎完全是一个不同的问题。
    • 感谢腐蚀,我已将此问题移至stackoverflow.com/questions/9542975/…
    • 顺便说一下,您可能想学习 ActiveRecord 计算方法,因为它可能会让您的生活更轻松 :) ar.rubyonrails.org/classes/ActiveRecord/Calculations/…
    【解决方案2】:

    简而言之:使用模块。我在想这样的事情:

    module TotalCalculator
      def sum
         map { |e| e.price * e.quantity }
      end
    end
    

    然后你可以:

    class Product
      include TotalCalculator
    end
    

    当然,这只是一个小例子,命名很糟糕。顺便说一句,你可以得到图片。我会将所有逻辑放在app/logic 之类的目录中或lib 目录中。有时我将这种技术称为模块作为业务逻辑模式,但我不知道它是否是正确的名称。

    【讨论】:

    • 感谢 lucapette,这真是个好主意。我会再考虑一下,并尝试将其纳入我的案例中。
    【解决方案3】:

    你能不能只在你的发票模型total_cost上创建一个虚拟属性,然后把你的代码放在那里?

    def total_cost 
      cost = #do your calculation here....
      return cost  
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2017-03-27
      • 2011-04-20
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多