Ruby on rails Rails 4代表
我真的很纠结于委托的概念以及如何将其付诸实践 我有一个包含以下字段的合同模型: 公司编号:, 合同类型(标准、无限、担保等), 固定成本, 每小时成本, 包括你的时间, 时间信用 存在一个属于合同的发票模型,该模型具有以下字段: 合同编号:, 开始日期, 结束日期, 使用的总时间, 启动信用卡, 期末学分, 总成本 我想运行一个服务对象来创建发票实例,填充使用的总时间(从另一个表),启动信用(从合同表),然后计算总成本。这是使用合同表中的数据计算得出的,根据合同模型中的合同类型(如标准、无限制),计算方法有所不同 我不希望在服务对象中使用一个大的if语句,因为最终可能会有多种类型的契约。我看到我可以有标准的、无限的类,它们具有相同的命名方法,但功能不同,例如计算成本,但我不太明白如何实际做到这一点,因此该方法也使用从合同表检索的数据Ruby on rails Rails 4代表,ruby-on-rails,delegates,Ruby On Rails,Delegates,我真的很纠结于委托的概念以及如何将其付诸实践 我有一个包含以下字段的合同模型: 公司编号:, 合同类型(标准、无限、担保等), 固定成本, 每小时成本, 包括你的时间, 时间信用 存在一个属于合同的发票模型,该模型具有以下字段: 合同编号:, 开始日期, 结束日期, 使用的总时间, 启动信用卡, 期末学分, 总成本 我想运行一个服务对象来创建发票实例,填充使用的总时间(从另一个表),启动信用(从合同表),然后计算总成本。这是使用合同表中的数据计算得出的,根据合同模型中的合同类型(如标准、无限制)
这有意义吗?可能没有,但如果有,我们将非常感谢您的指导。您的服务对象类应该如下所示:
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.对于标准合同总成本=固定成本+(使用的总时间-(包括时间+时间信用))*每小时成本您可以将其作为参数传递回委托方法计算成本:计算成本(使用的总时间)-谢谢-将看到我如何处理此问题…并让您知道。