Как расширить DataMapper :: Resource с помощью пользовательского метода - PullRequest
3 голосов
/ 12 августа 2010

У меня есть следующий код:

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

end

Затем у меня есть вызов #paginate:

@photos = Photo.paginate(params[:page])

И я получаю следующую ошибку:

application error
NoMethodError at /dashboard/photos/
undefined method `paginate' for Photo:Class

В Active record эта концепция отлично работает для меня ... Я использую JRuby для уведомления.Что я делаю не так?

1 Ответ

12 голосов
/ 13 августа 2010

Андрей

Вы можете думать о 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)

Надеюсь, это поможет!

...