選択の痕跡

音楽・テクノロジー・哲学

「User.paginate(page: 1)」のデフォルト取得件数で少しハマった話(Ruby on Rails チュートリアル 第10章 ユーザーの更新・表示・削除)

本質的ではないが、Ruby on Rails チュートリアル 第10章 ユーザーの更新・表示・削除で少しハマった点があったので、備忘までに記載しておく。
環境面は基本的に推奨のものをそのまま使用しているので、開発環境はAWS Cloud9。各種gemのバージョンも推奨通り。

railstutorial.jp

ハマった点

User.paginateは、:pageパラメーターに基いて、データベースからひとかたまりのデータ (デフォルトでは30) を取り出します。

$ rails console
>> User.paginate(page: 1)
  User Load (1.5ms)  SELECT "users".* FROM "users" LIMIT 30 OFFSET 0
   (1.7ms)  SELECT COUNT(*) FROM "users"
=> #<ActiveRecord::Relation [#<User id: 1,...

とのことなので、試してみたら、

>> user = User.paginate(page: 1)
  User Load (0.2ms)  SELECT  "users".* FROM "users" LIMIT ? OFFSET ?  [["LIMIT", 11], ["OFFSET", 0]]
   (0.1ms)  SELECT COUNT(*) FROM "users"
=> #<ActiveRecord::Relation [#<User id: 1,...

となった。

良く見ると、LIMITが、'30'じゃなくて'11'なのですがなぜ???となった。

画面上は100件が4ページになっているし、記載の通りデフォルトが30件になっているのだが、コンソール上ではデフォルトが11件になっている?となって、追加したgemのバージョン違い等を疑ったが、特に問題なさそうだった。

f:id:shogomusic:20200404172421p:plain

結論

ググったら、一応なんとなくは分かった。

github.com

f:id:shogomusic:20200404172442p:plain

まさしくじゃないですか。

で、回答は、

f:id:shogomusic:20200404172446p:plain

と、別のサイトに飛ばされたので、見てみると、

stackoverflow.com

f:id:shogomusic:20200404172449p:plain

とのことで、ちゃんとした回答にはなっていないようだが、コンソールでは「to_a」というメソッドを使わなければいけないらしい。

試してみると、確かに30件取得出来た。

>> user = User.paginate(page: 1).to_a
  User Load (0.3ms)  SELECT  "users".* FROM "users" LIMIT ? OFFSET ?  [["LIMIT", 30], ["OFFSET", 0]]
   (0.1ms)  SELECT COUNT(*) FROM "users"
=> [#<User id: 1,...

コンソールの仕様なのだろうか、根本の原因はいまだにわかっていないが、とりあえず今の自分にはこのレベルの回答で十分と判断。これ以上の深追いはしない。もし根本的な原因をご存じの方がいたら、お教えいただけると嬉しい。