【发布时间】:2016-05-02 18:15:05
【问题描述】:
说明
我创建了一个 Report 对象,它具有不同的环境/组 (:live & :demo),它们只是将填充有 ReportItem 对象的数组,这些对象具有以下属性 :currency, :gross, :net (并且 Gross & Net 持有 Ruby金钱对象)。
在Report.rb 类中有两个方法叫做add_money_to_net 和add_money_to_gross 都有一个我临时命名为@group 的变量
问题
(report = Report.new)
我想做的是像report.demo.add_money_to_gross(<params>) 这样的链式方法,如果调用此方法,我想访问report.demo(代替我的@group 变量)。或者调用report.live.add_money_to_gross(<params>) 应该让我访问report.live。这可能吗?
我希望这是有道理的。如果有什么不清楚的地方请告诉我。
Report.rb
class Report
include ActiveModel::Model
attr_accessor :demo, :live
def initialize
@demo = []
@live = []
end
def demo
@demo
self
end
def live
@live
self
end
def add_money_to_net(money)
add_money(group: @group, money: money)
end
def add_money_to_gross(money)
add_money(group: @group, money: money)
end
private
def add_money(group:, money:)
item = group.find {|s| s.currency == money.currency }
if item
item.net += money
else
group << ReportItem.new(currency: money.currency.to_s, net: money)
end
end
end
ReportItem.rb
class ReportItem
include ActiveModel::Model
attr_accessor :currency, :gross, :net
def initialize(currency:, gross: nil, net: nil)
@currency = currency
@gross = gross ? gross : Money.new(0, currency)
@net = net ? net : Money.new(0, currency)
end
def gross=(value)
@gross = value if @gross.currency == @currency
end
def net=(value)
@net = value if @net.currency == @currency
end
end
【问题讨论】:
标签: ruby-on-rails ruby method-chaining