Как расширить DataMapper::Resource с помощью пользовательского метода
У меня есть следующий код:
module DataMapper
module Resource
@@page_size = 25
attr_accessor :current_page
attr_accessor :next_page
attr_accessor :prev_page
def first_page?
@prev_page
end
def last_page?
@next_page
end
def self.paginate(page)
if(page && page.to_i > 0)
@current_page = page.to_i - 1
else
@current_page = 0
end
entites = self.all(:offset => @current_page * @@page_size, :limit => @@page_size + 1)
if @current_page > 0
@prev_page = @current_page
end
if entites.size == @@page_size + 1
entites.pop
@next_page = (@current_page || 1) + 2
end
entites
end
end
конец
Тогда у меня есть вызов #paginate:
@photos = Photo.paginate(params[:page])
И получаю следующую ошибку:
application error
NoMethodError at /dashboard/photos/
undefined method `paginate' for Photo:Class
В Active record эта концепция отлично работает для меня... Я использую JRuby для уведомления. Что я делаю не так?
1 ответ
Эндрю,
Вы можете думать о DataMapper::Resource как об экземпляре (строка) и о DataMapper::Model как о классе (таблица). Теперь, чтобы изменить возможности по умолчанию либо на уровне ресурса, либо на уровне модели, вы можете добавлять в модель включения или расширения.
Сначала вам нужно обернуть ваш метод #paginate в модуле. Я также добавил, вероятно, бесполезный метод #page, чтобы показать, как добавить ресурс, если он вам понадобится.
module Pagination
module ClassMethods
def paginate(page)
# ...
end
end
module InstanceMethods
def page
# ...
end
end
end
В вашем случае вы хотите, чтобы #paginate был доступен на модели, поэтому вы должны сделать:
DataMapper::Model.append_extensions(Pagination::ClassMethods)
Если вам нужно добавить возможности по умолчанию для каждого ресурса, выполните:
DataMapper::Model.append_inclusions(Pagination::InstanceMethods)
Надеюсь, это поможет!