我有以下代码:

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 进行通知。我做错了什么?

最佳答案

安德鲁,

您可以将 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)

希望有帮助!

关于ruby - 如何使用自定义方法扩展 DataMapper::Resource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3470260/

10-12 05:15