Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4代表_Ruby On Rails_Delegates - Fatal编程技术网

Ruby on rails Rails 4代表

Ruby on rails Rails 4代表,ruby-on-rails,delegates,Ruby On Rails,Delegates,我真的很纠结于委托的概念以及如何将其付诸实践 我有一个包含以下字段的合同模型: 公司编号:, 合同类型(标准、无限、担保等), 固定成本, 每小时成本, 包括你的时间, 时间信用 存在一个属于合同的发票模型,该模型具有以下字段: 合同编号:, 开始日期, 结束日期, 使用的总时间, 启动信用卡, 期末学分, 总成本 我想运行一个服务对象来创建发票实例,填充使用的总时间(从另一个表),启动信用(从合同表),然后计算总成本。这是使用合同表中的数据计算得出的,根据合同模型中的合同类型(如标准、无限制)

我真的很纠结于委托的概念以及如何将其付诸实践

我有一个包含以下字段的合同模型: 公司编号:, 合同类型(标准、无限、担保等), 固定成本, 每小时成本, 包括你的时间, 时间信用

存在一个属于合同的发票模型,该模型具有以下字段: 合同编号:, 开始日期, 结束日期, 使用的总时间, 启动信用卡, 期末学分, 总成本

我想运行一个服务对象来创建发票实例,填充使用的总时间(从另一个表),启动信用(从合同表),然后计算总成本。这是使用合同表中的数据计算得出的,根据合同模型中的合同类型(如标准、无限制),计算方法有所不同

我不希望在服务对象中使用一个大的if语句,因为最终可能会有多种类型的契约。我看到我可以有标准的、无限的类,它们具有相同的命名方法,但功能不同,例如计算成本,但我不太明白如何实际做到这一点,因此该方法也使用从合同表检索的数据


这有意义吗?可能没有,但如果有,我们将非常感谢您的指导。

您的服务对象类应该如下所示:

class Service
  attr_reader :contract

  delegate :method1, :method2, to: :contract

  def initialize(contract)
    @contract = contract
  end
end

然后您可以在服务内部直接调用method1和method2

委托?你是说遗产?看起来你的问题是根据合同类型计算总成本。这通常通过在
合同上使用继承来解决。e、 g.定义一个
标准合同
无限制合同
,这两个合同都源自
合同
。这里的问题是:当使用ActiveRecord模型时,您必须切换到

另一种方法是提取计算结果。所以在
lib/contract\u calculator.rb
中编写

class ContractCalculator

  def initialize(contract)
    @contract = contract
  end 

  def total_cost(invoice)
    # default implementation or empty?
  end
end 
然后可以添加子类。在
lib\standard\u contract\u calculator.rb中

class StandardContractCalculator < ContractCalculator
  def total_cost(invoice)
    # do the calculation for a standard-contract
  end 
end
class UnlimitedContractCalculator < ContractCalculator
  def total_cost(invoice)
    # do the calculation for a standard-contract
  end 
end
现在,您可以将以下代码添加到
合同中

def calculator
  @calculator = if contract_type == 'Standard' 
                  StandardContractCalculator.new(self)
                elsif contract_type == 'Unlimited'
                  UnlimitedContractCalculator.new(self)
                else
                  ContractCalculator.new(self)
                end
end

def total_cost(invoice)
  calculator.total_cost(invoice)
end
我做了一些捷径,好像我不知道你怎么决定它是什么类型的合同。因此,“工厂”代码(根据合同创建正确的计算器)您必须进行调整。为了简单起见,我假设
invoice
是一个参数。你也可以把它交给构造器


希望这能让您从正确的方向开始。

感谢您这么快的回复。。我遗漏了我需要将发票中使用的总时间传递回计算成本方法。e、 g.对于标准合同总成本=固定成本+(使用的总时间-(包括时间+时间信用))*每小时成本您可以将其作为参数传递回委托方法计算成本:计算成本(使用的总时间)-谢谢-将看到我如何处理此问题…并让您知道。