2010-05-19 5 views
5

Ich habe ein Problem mit will_paginate während einer komplexen Suche.Rails: Verwenden von will_paginate mit einer komplexen Zuordnung finden

Ich möchte alle Fotos abrufen, die alle Tags im Array tag_ids haben. MySQL IN sucht normalerweise "oder", aber ich brauche "und". Ich habe herausgefunden, wie man IN ändert, um "und" Verhalten here zu imitieren und es funktioniert gut, wenn model.find() verwendet wird, funktioniert auch, solange die Anzahl der abgerufenen Datensätze niedriger ist als mein: per_page count. Aber wenn es paginiert werden muss, ist die SQL, die generiert wird, ähnlich wie:

SELECT count(*) AS count_all, photos.id HAVING COUNT(DISTINCT tags.id) = 1 AS photos_id_having_count_distinct_tags_id_1 FROM `photos`(...) 

was nicht funktioniert. Andere haben diesen Fehler gesehen und konnten ihren count() aus der Abfrage entfernen, aber ich denke nicht, dass das in meinem Fall möglich ist.

Gibt es eine bessere Möglichkeit, diese Suche zu machen, die mit will_paginate funktionieren könnte? Wenn es der einzige Weg ist, dies zu tun, schätze ich, sollte ich in ein anderes Paginierungs-Plugin schauen?

Danke!

Antwort

4

FYI, hier ist was ich gefunden dies endlich zu beheben:

@photos = WillPaginate::Collection.create(current_page, per_page) do |pager| 
    result = @item.photos.find :all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}", :limit => pager.per_page, :offset => pager.offset 
    pager.replace(result) 

    unless pager.total_entries 
     pager.total_entries = @item.photos.find(:all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}").count 
    end 
    end 

Sie haben die paginierte Set mit der Seitennummer als Offset und unter Verwendung der Tags manuell zu konstruieren, eine Join-Abfrage zu machen. Irgendwie klobig.

1

Mein erster Stich hier (Entschuldigung habe keine Zeit, es jetzt zu testen ... wird aktualisiert, wenn ich tue) wäre etwas wie folgt (hinzugefügt: wählen und änderte die: Gruppe):

@photos = @item.photos.paginate :page => params[:page], 
           :per_page => 200, 
           :select => "photos.*, COUNT(DISTINCT tags.id) AS tag_count", 
           :conditions => [ 'tags.id IN (?)', tag_ids ], 
           :order => 'created_at DESC', 
           :joins => :tags, 
           :group => "photos.id HAVING tag_count = #{tag_count}" 
Verwandte Themen