ruby / datamapper: методы класса Refactor для модуля - PullRequest
1 голос
/ 24 мая 2010

Я написал следующий код и целый день пытался реорганизовать методы класса в отдельный модуль, чтобы поделиться функциональностью со всеми моими классами моделей.

Код (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 )

Но, к сожалению, мои навыки рубина плохие. Я много читаю (например, здесь ) и теперь я еще больше запутался. Я наткнулся на следующие два момента:

  1. alias_method не удастся, потому что он будет динамически определен в модуле DataMapper::Resource.
  2. Как получить метод класса allowed_properties из-за наличия модуля?

Что такое рубиновый путь?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 25 мая 2010

Здесь - хорошее обсуждение наследования модуля метода класса 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 - это то, что вы часто видите в кодовой базе Rails, и упрощает использование super.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...