Методы повторного использования Ruby в классах DataMapper (помощник)

Я пытаюсь повторно использовать методы в классах DataMapper. Думаю, это может быть и рубиновым вопросом.

class Foo
  include DataMapper::Resource

  property :name
  property ...

  def self.special_name
    self.all(:name => 'whatever')
  end
end

class Bar
  include DataMapper::Resource

  property :name
  property ...

  def self.special_name
    self.all(:name => 'whatever')
  end
end

Поэтому метод special_name будет использоваться для обоих классов, так как я хочу получить один и тот же результат. Но он также использует методы DataMapper, такие как "все". Так как бы вы это сделали?

Спасибо

3 ответа

Решение
module SpecialName
  def self.included(base)
    base.property :name, String
    base.extend ClassMethods
  end

  module ClassMethods
    def special_name
      all(:name => 'whatever')
    end
  end
end

class Foo
  include DataMapper::Resource
  include SpecialName
end

Для получения дополнительной информации об этой идиоме include/extension см. http://railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/.


module SpecialName

property :name def self.special_name self.all(:name => 'whatever') end end

class Foo include DataMapper::Resource include SpecialName end

class Bar include DataMapper::Resource include SpecialName end

"Ответ" неверен. См. Ответ на этот вопрос для получения дополнительной информации: Как расширить DataMapper:: Resource с помощью пользовательского метода

Короткая версия: вам необходимо использовать встроенные расширители DataMapper, потому что запись / строка и модель / таблица имеют разные классы.

DataMapper::Model.append_extensions(MyModule::ClassMethods) #Add to model
DataMapper::Model.append_inclusions(MyModule::InstanceMethods) #Add to record
Другие вопросы по тегам