Patch de correção do will_paginate para o acts_as_fulltextable

Encontrei um erro ao paginar os resultados de buscas com o plugin acts_as_fulltextable utilizando will_paginate. O acts_as_fulltextable passa uma série de opções para que o método paginate execute a query com MATCH()…AGAINST dentro da chave :SELECT, como foi explicado no post anterior. O Will_paginate por sua vez, não trata esse tipo de select complexo quando requer o número total de registros ao banco, utilizado em SELECT COUNT(…), que retorna um erro de má formação de SQL.

Corrigi esse problema adicionando uma linha ao código do Will_paginate, no método method_missing_with_paginate que o faz rejeitar opções da chave :select, fazendo sempre um count(*) no banco. Esse método se encontra no arquivo finder.rb que está no diretório will_paginate\lib\will_paginate\, na pasta de plugins do seu projeto. Veja o trecho alterado:


def method_missing_with_paginate(method, *args, &block)
        # ....
        # :total_entries and :count are mutually exclusive!
        total_entries = unless options[:total_entries]
          unless args.first.is_a? Array
        # count expects (almost) the same options as find

count_options = options.reject { |key, value| key == :count or key == :o rder }

#***aqui removo as opções de select também, que causam erro de SQL ***

count_options = count_options.reject { |key, value| key == :select }

# merge the hash found in :count
# this allows you to specify :select, :o rder, or anything else just for the count query

count_options.update(options.delete(:count)) if options[:count]
# thanks to active record for making us duplicate this code

count_options[:conditions] ||= wp_extract_finder_conditions(finder, args)

count = count(count_options)

count.respond_to?(:length) ? count.length : count
           #....
        end
      end

Depois de alterar o código, é necessário reiniciar o servidor.

Disponibilizei o arquivo com o código alterado: http://www.mediafire.com/?5n1icgnxwy5

1 comment so far

  1. [...] [update]Existe um erro nesta integração entre os dois plugins, veja aqui como corrigir[/update] [...]


Leave a reply