Методы повторного использования 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