ruby / datamapper:重构模块的类方法

时间:2010-05-24 18:17:36

标签: ruby class module datamapper

我有以下代码并尝试了一整天将类方法重构为sperate模块以与我的所有模型类共享功能。

代码(http://pastie.org/974847):

class Merchant
  include DataMapper::Resource

  property :id, Serial                                             
  [...]

  class << self
    @allowed_properties = [:id,:vendor_id, :identifier]

    alias_method :old_get, :get 
    def get *args
      [...]
    end         

    def first_or_create_or_update attr_hash  
      [...]
    end     
  end

end     

我想存档类似的内容:

class Merchant
  include DataMapper::Resource
  include MyClassFunctions
  [...]
end

module MyClassFunctions
  def get [...]
  def first_or_create_or_update[...]
end

=> Merchant.allowed_properties = [:id]
=> Merchant.get( :id=> 1 )

但不幸的是,我的红宝石技能很糟糕。我读了很多东西(例如here),现在我更加困惑了。我偶然发现了以下两点:

  1. alias_method将失败,因为它将在DataMapper::Resource模块中动态定义。
  2. 如何获得包含模块的类方法allowed_properties
  3. 什么是红宝石的方式?

    非常感谢提前。

1 个答案:

答案 0 :(得分:0)

Here是关于ruby类方法模块继承的一个很好的讨论。 这样的事情可以奏效:

module MyFunctions
  module ClassMethods
    @allowed_properties = [:id,:vendor_id, :identifier]

    def get *args
      opts = super_cool_awesome_sauce
      super opts
    end

    def first_or_create_or_update[...]
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end
end

class Merchant
  include DataMapper::Resource
  include MyFunctions
  [...]
end

因为它使用的是一种继承形式,所以您可以利用super而不是alias_method来使用ModuleName::ClassMethods,而许多人认为这更为直接。

使用super是您在Rails代码库中看到的很多内容,可以更轻松地使用{{1}}。