使用している環境は
Rails 4.2.6
ruby 2.3.1p112
psql (PostgreSQL) 9.2.18
今回困っていること
・ページングが何故かうまくいかない
・自分の意図したクエリを回せているのか
使用しているモデルは
Restaurant
Menu
の二つで
Restaurant
has_many Menu
Menu
belongs_to Restaurant
の関係です。
RestaurantImg
も使用してありますが、Menuと同じく
Restaurantと1対多の関係です。
今回、レストランが複数持っているメニューのうち
最安価格を基準にして、レストランの表示順を安い順に設定したいです。
(ここで、自分のしたいように正しくactive recordを使えているのか、定かでない。)
しかし、何故かページングが正しく動作しません。
使用しているgemはkaminariです。
具体的に言うと、
レストランの総数は19個あり、
そのうち1ページにつき10個のレストランを表示するように設定しているのですが
1ページ目には8個しかでない、という状況になっています。
以下のようにレストラン一覧を取得しています
@restaurants = Restaurant.where(:data_status => "active").genre(params[:genre]).area(params[:area]).includes(:restaurant_imgs, :menus).where(restaurant_imgs: {size: "normal"}).sort(params[:sort]).page(@page).per(10)
こういった内容でレストランを取得していました。
各scopeは以下の通りです。
scope :genre, -> (genre) { if genre.present? && genre != "all" where("restaurants.genre = ?", genre) end }
scope :area, -> (area) { if area.present? && area != "all" where("restaurants.area = ?", area) end }
scope :sort, -> (sort) { if sort.present? && sort == "price" order("menus.price asc, restaurants.pickup desc") end }
restaurants.pickupは
数字で管理されていて、各レストランに一意に保存されていてます。
(書き忘れ)
kaminariで表示する検索結果の文言についてです。
page_entries_info
というヘルパーメソッドで検索結果の数について表示をしてくれるのですが
そこで
「19つの全てのレストランを表示しています」と出ているにもかかわらず
1ページあたり10つを表示と設定してあるページに
8つしかレストランが表示されません。
データを取り出す部分と、kaminariと
両方ともにおかしいところがあるのではないかと思っております。
また、1ページあたり100と極端に設定すると
DBに入ってある19つのレストランが全て表示されます。
不可解です。。
(ログを見てみる)
[1m[36mSQL (3.3ms)[0m [1mSELECT DISTINCT "restaurants"."id", menus.price AS alias_0 FROM "restaurants" LEFT OUTER JOIN "menus" ON "menus"."restaurant_id" = "restaurants"."id" AND "menus"."data_status" = $1 WHERE "restaurants"."data_status" = $2 ORDER BY menus.price ASC LIMIT 10 OFFSET 0[0m [["data_status", "active"], ["data_status", "active"]] [1m[35m (3.2ms)[0m SELECT COUNT(DISTINCT "restaurants"."id") FROM "restaurants" LEFT OUTER JOIN "menus" ON "menus"."restaurant_id" = "restaurants"."id" AND "menus"."data_status" = $1 WHERE "restaurants"."data_status" = $2 AND "restaurants"."id" IN (13, 4, 5, 10, 17, 2, 6, 18, 6, 5) [["data_status", "active"], ["data_status", "active"]] [1m[36m (3.1ms)[0m [1mSELECT COUNT(DISTINCT "restaurants"."id") FROM "restaurants" LEFT OUTER JOIN "menus" ON "menus"."restaurant_id" = "restaurants"."id" AND "menus"."data_status" = $1 WHERE "restaurants"."data_status" = $2[0m [["data_status", "active"], ["data_status", "active"]] [1m[35mCACHE (0.0ms)[0m SELECT DISTINCT "restaurants"."id", menus.price AS alias_0 FROM "restaurants" LEFT OUTER JOIN "menus" ON "menus"."restaurant_id" = "restaurants"."id" AND "menus"."data_status" = $1 WHERE "restaurants"."data_status" = $2 ORDER BY menus.price ASC LIMIT 10 OFFSET 0 [["data_status", "active"], ["data_status", "active"]]
以上のようなログが出ているのですが
ORDER BY menus.price
これが入っていると
"restaurants"."id" IN (13, 4, 5, 10, 17, 2, 6, 18, 6, 5)
これが入るのですが、なぜここで5,6が重複してしまうのでしょうか。
これが原因で、10件表示としているにもかかわらず8件しか出ない、というようになっていると思います。
並び順を指定するだけで重複するようなことになってしまうのが、よく分かりません。。。
宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/05 13:16