2010-05-19 17 views
5

Tengo un problema con will_paginate mientras realizo un descubrimiento complejo.Rieles: el uso de will_paginate con una asociación compleja encuentra

:photo has_many :tags, :through => :tagships 
:item has_many :photos 
:photo belongs_to :item 


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

Quiero buscar todas las fotos que tienen todas las etiquetas en la matriz de etiquetas_de_tareas. La IN de MySQL generalmente hace "o" búsquedas, pero necesito "y". Encontré cómo modificar IN para imitar "y" el comportamiento here y funciona bien cuando se usa model.find(), también funciona siempre que el número de registros obtenidos sea menor que mi: recuento de páginas. Pero si tiene que paginar, el SQL que se genera es similar a:

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

que no funciona. Otros han visto este error y han podido sacar su conteo() de la consulta, pero no creo que eso sea posible en mi caso.

¿Existe alguna forma mejor de hacer esta búsqueda que podría funcionar con will_paginate? Si es la única forma de hacerlo, creo que debería buscar otro plugin de paginación.

Gracias!

Respuesta

4

FYI, esto es lo que finalmente encontró para solucionar este problema:

@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 

Usted tiene que construir manualmente el conjunto paginado utilizando el número de página como un desplazamiento y el uso de las etiquetas para hacer una consulta de unión. Un poco torpe

1

Mi primera puñalada en esto (lo siento, no tengo tiempo para probarla en este momento ... actualizaré si lo hago) sería algo como lo siguiente (agregué: seleccionar y cambiar el: grupo):

@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}" 
Cuestiones relacionadas