質問

私は検索可能な写真のセットを持っています、そして、インデックスページの結果を公開されているものに制限したいと思います(つまり、プライベートコレクションに属していません、別名。 :collection_id=>nil).

モデルには次の範囲があります。

scope :community, where(:collection_id => nil)

コントローラーには次のとおりです。

def index
  @search = Photo.community.search(params[:search])
  @photos = @search.page(params[:page]).per(20)
end

私はカミナリを使用して結果をページングしています。

写真をunscoped(すなわち、写真を検索すると Photo.search(params[:search]))それは正常に動作します。ただし、このスコープページネーションを使用して写真を検索すると、検索が破損します。最初のページは正しく表示されますが、別のページに行くと結果はありません。これをローカルでテストするために、私はページにページを1ページに1つに変更しましたが、最初のページに何を検索しても、ページが表示された後、ページが表示されていません。

これをデバッグして修正する方法がわかりません。本当にヘルプを使用します。開発ログのSQLは次のとおりです。

インデックスページの通常の負荷の場合(検索なし):

Started GET "/photos" for 127.0.0.1 at 2011-04-28 11:58:51 -0500
  Processing by PhotosController#index as HTML
  SQL (0.4ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

  SQL (0.3ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Context Load (0.3ms)  SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
  Focus Load (0.3ms)  SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
  LandUse Load (0.3ms)  SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.5ms)
Rendered static/_help-focus.html.haml (3.1ms)
Rendered photos/_search.html.haml (304.9ms)
  SQL (0.5ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL LIMIT 1 OFFSET 0
  Photo Load (1.0ms)  SELECT "photos".* FROM "photos" WHERE "photos"."collection_id" IS NULL LIMIT 1 OFFSET 0
  Attachment Load (0.2ms)  SELECT "attachments".* FROM "attachments" WHERE ("attachments".photo_id = 1)
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1)
  Profile Load (1.7ms)  SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
  Context Load (0.2ms)  SELECT "contexts".* FROM "contexts" WHERE "contexts"."id" = 6 ORDER BY "contexts"."display_order" ASC LIMIT 1
  Focus Load (0.1ms)  SELECT "focus".* FROM "focus" WHERE "focus"."id" = 2 ORDER BY "focus"."display_order" ASC LIMIT 1
  LandUse Load (0.2ms)  SELECT * FROM "land_uses" INNER JOIN "land_uses_photos" ON "land_uses".id = "land_uses_photos".land_use_id WHERE ("land_uses_photos".photo_id = 1 ) ORDER BY "land_uses"."display_order" ASC
Rendered photos/_photo_tiles.html.haml (62.2ms)
  SQL (0.2ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL
Rendered shared/_feedback.html.haml (1.5ms)
  Role Load (0.5ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
  CACHE (0.0ms)  SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (177.6ms)
Rendered shared/_footer.html.haml (2.7ms)
Rendered photos/index.html.haml within layouts/application (897.1ms)
Completed 200 OK in 1158ms (Views: 912.2ms | ActiveRecord: 8.2ms)

検索の最初のページ(正しく動作):

Started GET "/photos?utf8=%E2%9C%93&search%5Bcontext_id_in%5D%5B%5D=6&search%5Btagged_with%5D=&search%5Btext_contains%5D=&search%5Bnear%5D%5B%5D=&search%5Bnear%5D%5B%5D=100&commit=Search" for 127.0.0.1 at 2011-04-28 12:00:39 -0500
  Processing by PhotosController#index as HTML
  Parameters: {"utf8"=>"✓", "search"=>{"context_id_in"=>["6"], "tagged_with"=>"", "text_contains"=>"", "near"=>["", "100"]}, "commit"=>"Search"}
  SQL (0.4ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

  SQL (0.3ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Context Load (0.4ms)  SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
  Focus Load (0.3ms)  SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
  LandUse Load (0.4ms)  SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.6ms)
Rendered static/_help-focus.html.haml (3.1ms)
Rendered photos/_search.html.haml (161.0ms)
  SQL (0.4ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 0
  Photo Load (0.7ms)  SELECT "photos".* FROM "photos" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 0
  Attachment Load (0.2ms)  SELECT "attachments".* FROM "attachments" WHERE ("attachments".photo_id = 1)
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1)
  Profile Load (1.9ms)  SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
  Context Load (0.2ms)  SELECT "contexts".* FROM "contexts" WHERE "contexts"."id" = 6 ORDER BY "contexts"."display_order" ASC LIMIT 1
  Focus Load (0.2ms)  SELECT "focus".* FROM "focus" WHERE "focus"."id" = 2 ORDER BY "focus"."display_order" ASC LIMIT 1
  LandUse Load (0.2ms)  SELECT * FROM "land_uses" INNER JOIN "land_uses_photos" ON "land_uses".id = "land_uses_photos".land_use_id WHERE ("land_uses_photos".photo_id = 1 ) ORDER BY "land_uses"."display_order" ASC
Rendered photos/_photo_tiles.html.haml (204.2ms)
  SQL (0.3ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6)
Rendered shared/_feedback.html.haml (1.3ms)
  Role Load (0.4ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
  CACHE (0.0ms)  SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (35.5ms)
Rendered shared/_footer.html.haml (2.9ms)
Rendered photos/index.html.haml within layouts/application (729.3ms)
Completed 200 OK in 990ms (Views: 728.5ms | ActiveRecord: 7.7ms)

検索の2番目のページの場合(存在しても結果が表示されません):

Started GET "/photos?commit=Search&page=2&search[context_id_in][]=6&search[near][]=&search[near][]=100&search[tagged_with]=&search[text_contains]=&utf8=%E2%9C%93" for 127.0.0.1 at 2011-04-28 12:01:33 -0500
  Processing by PhotosController#index as HTML
  Parameters: {"commit"=>"Search", "page"=>"2", "search"=>{"context_id_in"=>["6"], "near"=>["", "100"], "tagged_with"=>"", "text_contains"=>""}, "utf8"=>"✓"}
  SQL (0.4ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

  SQL (0.3ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Context Load (0.3ms)  SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
  Focus Load (0.3ms)  SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
  LandUse Load (0.3ms)  SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.9ms)
Rendered static/_help-focus.html.haml (3.4ms)
Rendered photos/_search.html.haml (307.8ms)
  SQL (0.3ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 1
  SQL (0.3ms)  SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6)
Rendered shared/_feedback.html.haml (1.5ms)
  Role Load (0.4ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
  Profile Load (1.6ms)  SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (209.5ms)
Rendered shared/_footer.html.haml (2.7ms)
Rendered photos/index.html.haml within layouts/application (822.3ms)
Completed 200 OK in 934ms (Views: 823.7ms | ActiveRecord: 5.1ms)

繰り返しますが、上記のログでは、ページごとにページネーションを1ページに設定しているため、ペジネーターが適切な数の結果を示しているかどうかを確認できます。たとえば、ページごとに3つの一致があることを知っているものを検索すると、Paginatorは3ページの結果があると言いますが、2ページと3ページは空白です。

私は完全に困惑しています、どんな助けも大歓迎です。

役に立ちましたか?

解決

検索方法としてスコープを追加してみてください。

class Photo < ActiveRecord::Base
  scope :community, where(:collection_id => nil)
  search_methods :community
end

class PhotosController < ActiveRecord::Base
  def index
    params[:search][:community] => true
    @search = Photo.search(params[:search])
    @photos = @search.page(params[:page]).per(20)
  end
end

私は自分でカミナリを使用していないので、確かに言うことはできませんが、Metasearchドキュメントは、検索でスコープを使用するためにSearch_Methodsを使用すると言っていることを知っています。

他のヒント

現在の最新のGEMS(Meta_Search 1.0.4、Kaminari 0.12.4)で機能します。

Kaminari Gemの著者として、Kaminariの古いバージョンがMeta_searchで動作しない可能性があると思います。この種の問題を引き起こす可能性のあるいくつかのバグを実際に修正しました。

カミナリの宝石をアップグレードして、もう一度やり直していただけますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top