2013-02-25 22 views
1

我有一個名爲Review的基本模型(基本上只是一個ID序列和一些文本列),我正在爲它製作一個簡單的分頁系統。 下面的代碼:分頁DataMapper

Review.all(:limit => per_page, :offset => offset, :order => [ :id.asc ]) 

返回正確的對象,如果偏移是0,但如果有問題的偏移量爲別的。 有偏移> 0,代碼:

reviews = Review.all(:offset => offset, :limit => per_page); 
p reviews 
p reviews.count 

回報

[#<Review @id=11 @created_at=<not loaded> @rating=<not loaded> @title=<not loaded> @text= <not loaded> @name=<not loaded> @from=<not loaded> @stay_date=<not loaded> @helpful=0 @not_helpful=0 @response=<not loaded>>, #<Review @id=12 @created_at=<not loaded> @rating=<not loaded> @title=<not loaded> @text=<not loaded> @name=<not loaded> @from=<not loaded> @stay_date=<not loaded> @helpful=0 @not_helpful=0 @response=<not loaded>>, #<Review @id=13 @created_at=<not loaded> @rating=<not loaded> @title=<not loaded> @text=<not loaded> @name=<not loaded> @from=<not loaded> @stay_date=<not loaded> @helpful=0 @not_helpful=0 @response=<not loaded>>, #<Review @id=14 @created_at=<not loaded> @rating=<not loaded> @title=<not loaded> @text=<not loaded> @name=<not loaded> @from=<not loaded> @stay_date=<not loaded> @helpful=0 @not_helpful=0 @response=<not loaded>>, #<Review @id=15 @created_at=<not loaded> @rating=<not loaded> @title=<not loaded> @text=<not loaded> @name=<not loaded> @from=<not loaded> @stay_date=<not loaded> @helpful=0 @not_helpful=0 @response=<not loaded>>] 
0 

這是怎麼回事?它找到的對象,但不能指望它們?

回答

1

您可以將惰性列表轉換爲#to_a#count(例如Review.all(:limit => 10, :offset => 10).to_a.count)。

順便說一句,在Array的精神中有極好的句法糖來限制和抵消:Review[offset,limit]

完整的示例:

require 'rubygems' 
require 'dm-core' 
require 'dm-migrations' 
require 'dm-sweatshop' # just to load some fixtures 

DataMapper::Logger.new($stdout, :debug) 
DataMapper.setup(:default, "sqlite::memory:") 

class Review 
    include DataMapper::Resource 
    property :id,   Serial 
    property :title,  String, :required => true 
    property :rating,  Integer, :min => 1, :max => 10 
    property :created_at, DateTime, :default => lambda {Time.now} 
end 

DataMapper.finalize.auto_migrate! 

class FixtureHelpers # Just to cache for sweatshop, avoid polluting top-level 
    @@date_range = (Date.new(2003)..Date.today).to_a 
    def self.rand_date; @@date_range.choice end 
end 

Review.fix {{ 
    :title => /\w+/.gen.capitalize, 
    :rating => (1..10).to_a.choice, 
    :created_at => FixtureHelpers.rand_date 
}} 

100.of {Review.gen} 

p Review[95,10].to_a.count 
# ~ (0.000105) SELECT "id", "title", "rating", "created_at" FROM "reviews" ORDER BY "id" LIMIT 10 OFFSET 95 
# => 5