6

paginate呼び出しで重複したエントリを取得しています。

コードは次のとおりです。

@reviews = @ user.reviews.paginate(:page => params [:page]、:per_page => 5)

ターミナルでこれを実行すると、重複したエントリが返されます。次に例を示します。

ページ1:

1.9.3p327 :040 > me.reviews.paginate(:page => 1, :per_page => 5)
  Review Load (2.1ms)  SELECT "reviews".* FROM "reviews" WHERE "reviews"."user_id" = 43 ORDER BY rating DESC LIMIT 5 OFFSET 0
   (1.0ms)  SELECT COUNT(*) FROM "reviews" WHERE "reviews"."user_id" = 43
 => [#<Review id: 319>, #<Review id: 322>, #<Review id: 318>, #<Review id: 323>, #<Review id: 313>] 

2ページ:

1.9.3p327 :045 > me.reviews.paginate(:page => 2, :per_page => 5)
  Review Load (1.3ms)  SELECT "reviews".* FROM "reviews" WHERE "reviews"."user_id" = 43 ORDER BY rating DESC LIMIT 5 OFFSET 5
   (0.7ms)  SELECT COUNT(*) FROM "reviews" WHERE "reviews"."user_id" = 43
 => [#<Review id: 313>, #<Review id: 324>, #<Review id: 315>, #<Review id: 310>, #<Review id: 312>] 

レビュー#313は両方の時間に発生することに注意してください。

ただし、me​​.reviewsを実行すると、各IDは1回だけ発生します。

私はこれに一日中取り組んでいるので、あなたが必要とするかもしれないどんな情報でも更新するために迅速に対応することができます。私は前向きに混乱しています。

4

1 に答える 1

14

レビューに重複する評価があります(例:4、4、4、4、3、3、3、3など)。同点の場合、2つの異なるクエリで結果が同じ順序になるとは限りません。にセカンダリソートを追加することで、これを解決できますid。これにより、クエリ全体の並べ替え順序が保証され、異なるページに重複が生じることはありません。

me.reviews.order(:rating, :id).paginate(...)
于 2013-03-26T02:27:35.667 に答える