我需要一些帮助来理解这个Ruby代码。外行人越多越好。
方法cancelled?
委托给current_state
,并尝试获取state == 'cancelled'
的事件。如果找不到,它将返回STATES
数组中的第一个元素,默认为打开。
current_state
如何知道我们想要取消?如果我们想要incomplete?
或open?
该怎么办?当我们致电self.cancelled?
时,我们没有提供任何参数。
委托方法如何返回布尔值? current_state
不返回布尔值。它始终返回Event
或STATES[0]
。
显然我错过了一些东西。这是我正在学习的the example app。
class Order < ActiveRecord::Base
has_many :events
STATES = %w[incomplete open cancelled shipped]
delegate :incomplete?, :open?, :cancelled?, to: :current_state
def current_state
(events.last.try(:state) || STATES.first).inquiry
end
def cancel
events.create! state: 'cancelled' if open?
end
def resume
events.create! state: 'open' if cancelled?
end
end
答案 0 :(得分:2)
delegate
可以被认为是“将这些方法发送到此目标”,所以
self.cancelled?
扩展为
(events.last.try(:state) || STATES.first).inquiry.cancelled?
这是查询方法:http://apidock.com/rails/String/inquiry
基本上,它检查数据模型中的最后一个事件状态(或默认的“不完整”)是否具有等于方法名称的字符串值(减去问号),如果匹配则返回true。