ruby delegate enumerize field

时间:2014-04-14 13:42:07

标签: ruby-on-rails ruby

使用enumerize字段的模型:

class ModelB < ActiveRecord::Base
  extend Enumerize

  attr_accessible :field_in_delegate

  enumerize :field_in_delegate,
            in: {option_one: 1, option_two: 2, option_three: 3},
            default: :option_one, predicates: true, scope: true
end

我可以在字段为枚举时委托field_in_delegate

class ModelA < ActiveRecord::Base
  extend Enumerize


  attr_accessible :field_in_delegate

  delegate :field_in_delegate, to: :model_b

  has_one :model_b  
end

然后我可以打电话

  

modelA.field_in_delegate

没有问题,但我不能打电话

  

modelA.option_one?

如何通过委托

干燥模式访问enumerize gem提供的帮助方法

1 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点:

  1. 覆盖method_missing上的ModelA以将任何缺少的方法调用转发给代理

    class ModelA < ActiveRecord::Base
      extend Enumerize
      ...
      delegate :field_in_delegate, to: :model_b
    
      def method_missing(method, *args, &block)
        if field_in_delegate.respond_to?(method)
          field_in_delegate.send(method, *args, &block)
        else
          super
        end
      end
    end
    
  2. 将个别方法委派给field_in_delegate

    class ModelA < ActiveRecord::Base
      extend Enumerize
      ...
      delegate :field_in_delegate, :option_one?, :option_two?, to: :model_b
    end
    

    使用这种方法,您可以定义每个要求委派的内容。