title: Rails: Metasearch breaks when scoped and paginated?
body: <p>I have a searchable set of photos, and I want to limit the results for the index page to ones that are public (ie don't belong to a private collection, aka. <code>:collection_id=&gt;nil</code>).</p>
  
  <p>I have the following scope in my model:</p>
  
  <pre><code>scope :community, where(:collection_id =&gt; nil)
  </code></pre>
  
  <p>I have the following in my controller:</p>
  
  <pre><code>def index
    @search = Photo.community.search(params[:search])
    @photos = @search.page(params[:page]).per(20)
  end
  </code></pre>
  
  <p>I'm using Kaminari to paginate the results.</p>
  
  <p>When I search photos unscoped (ie <code>Photo.search(params[:search])</code>) it works fine. However, when I search for photos using this scope pagination breaks the search. The first page shows up correctly, but when I go to another page there are no results. To test this locally I changed pagination to 1 per page and still no matter what I search for any pages after the first page show no results even though the paginator indicates that there are many more pages of results.</p>
  
  <p>I have no idea how to debug and fix this, and I would really use some help. Here's the SQL from the development log:</p>
  
  <p>For a normal load of the index page (no search):</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>For the first page of a search (works correctly):</p>
  
  <pre><code>Started GET "/photos?utf8=%E2%9C%93&amp;search%5Bcontext_id_in%5D%5B%5D=6&amp;search%5Btagged_with%5D=&amp;search%5Btext_contains%5D=&amp;search%5Bnear%5D%5B%5D=&amp;search%5Bnear%5D%5B%5D=100&amp;commit=Search" for 127.0.0.1 at 2011-04-28 12:00:39 -0500
    Processing by PhotosController#index as HTML
    Parameters: {"utf8"=&gt;"✓", "search"=&gt;{"context_id_in"=&gt;["6"], "tagged_with"=&gt;"", "text_contains"=&gt;"", "near"=&gt;["", "100"]}, "commit"=&gt;"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)
  </code></pre>
  
  <p>For the second page of a search (shows no results even though they exist):</p>
  
  <pre><code>Started GET "/photos?commit=Search&amp;page=2&amp;search[context_id_in][]=6&amp;search[near][]=&amp;search[near][]=100&amp;search[tagged_with]=&amp;search[text_contains]=&amp;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"=&gt;"Search", "page"=&gt;"2", "search"=&gt;{"context_id_in"=&gt;["6"], "near"=&gt;["", "100"], "tagged_with"=&gt;"", "text_contains"=&gt;""}, "utf8"=&gt;"✓"}
    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)
  </code></pre>
  
  <p>Again note that in the logs above I have set pagination to 1 per page so I can see if the paginator is showing the right number of results, and it is. For instance, if I search for something I know there are 3 matches for at one per page the paginator says there are three pages of results, however pages 2 and 3 are blank.</p>
  
  <p>I am completely stumped, any help would be much appreciated.</p>