2

我需要一些帮助来理解这段 Ruby 代码。越外行越好。

该方法cancelled?委托给current_state,这将尝试获取一个事件 where state == 'cancelled'。如果没有找到,它将返回STATES数组中的第一个元素,默认为打开。

  1. 怎么current_state知道我们想要取消?如果我们想要incomplete?或者open?我们在调用时没有提供任何参数怎么办self.cancelled?

  2. 委托方法如何返回布尔值?current_state不返回布尔值。它总是返回一个Eventor STATES[0]

显然我错过了一些东西。这是我正在学习的示例应用程序。

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
4

1 回答 1

2

delegate可以认为是“将这些方法发送到这个目标”,所以

self.cancelled?

扩展到

(events.last.try(:state) || STATES.first).inquiry.cancelled?

这是查询方法:http ://apidock.com/rails/String/inquiry

所以基本上,它检查数据模型中的最后一个事件状态(或默认的“不完整”)是否具有等于方法名称(减去问号)的字符串值,如果匹配则返回 true。

于 2013-05-15T21:20:51.490 回答