这个Ruby类中的委托方法如何工作?

时间:2013-05-15 21:02:35

标签: ruby-on-rails ruby

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

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

  1. current_state如何知道我们想要取消?如果我们想要incomplete?open?该怎么办?当我们致电self.cancelled?时,我们没有提供任何参数。

  2. 委托方法如何返回布尔值? current_state不返回布尔值。它始终返回EventSTATES[0]

  3. 显然我错过了一些东西。这是我正在学习的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
    

1 个答案:

答案 0 :(得分:2)

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

self.cancelled?

扩展为

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

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

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