1

Review と呼ばれる非常に基本的なモデル (基本的には ID シリアルといくつかのテキスト列のみ) があり、そのための単純なページネーション システムを作成しています。次のコード:

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

これはどのように?オブジェクトを見つけていますが、それらを数えることはできませんか?

4

1 に答える 1

1

#to_aおよびそれを使用して、遅延リストを配列に変換できます#count(例: Review.all(:limit => 10, :offset => 10).to_a.count)。

ところで、 limit と offset には、 : の精神に基づいたかなり優れた構文糖衣があり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
于 2013-02-25T07:48:36.207 に答える