Wrong total_hits when using conditions in find_by_contents

I don’t know if this is a bug, or wanted behavior, but for me it was a
pain in… So here’s the problem + a bugfix.

Lets say you have a model “Article” with the following fields: title,
visible - and these records

title, visible ferret talk, 1 ruby talk, 0 ruby on rails, 1 lets talk about ruby, 1

If I let Article act as a ferret, and do:

result = Article.find_by_content(‘ruby’)

Result will contain 3 items and “total_hits” will return 3

However, if I add a condition:

result = Article.find_by_content(‘ruby’, {}, ‘visible = 1’)

Result will contain 2 items - which is correct

But “hotal_hits” will still return 3 - not what I would expect.


Fix for this:

  1. In the acts_as_ferret plugin, find the file class_methods.rb

  2. Go to line 276 where you have this code-block

if results.any? conditions = combine_conditions([ "#{table_name}.#{primary_key} in (?)", results.keys ], find_options[:conditions]) result = self.find(:all, find_options.merge(:conditions => conditions)) end

and add this line:

if results.any? conditions = combine_conditions([ "#{table_name}.#{primary_key} in (?)", results.keys ], find_options[:conditions]) result = self.find(:all, find_options.merge(:conditions => conditions)) total_hits = result.length <===== ADD THIS!!! end

  • Carsten

Ah bloody hell…

Sorry for the strange tags, I thought the forum supported BBCode…

  • Carsten

On Tue, Jan 16, 2007 at 12:48:07AM +0100, Carsten G. wrote:

Ah bloody hell…

Sorry for the strange tags, I thought the forum supported BBCode…

that’s because it’s a mailing list in the first place :wink:

Jens


webit! Gesellschaft für neue Medien mbH www.webit.de
Dipl.-Wirtschaftsingenieur Jens Krämer [email protected]
Schnorrstraße 76 Tel +49 351 46766 0
D-01069 Dresden Fax +49 351 46766 66

Hi!

On Tue, Jan 16, 2007 at 12:47:17AM +0100, Carsten G. wrote:

I don’t know if this is a bug, or wanted behavior, but for me it was a
pain in… So here’s the problem + a bugfix.

right, that’s a bug. I just committed a less invasive fix that will only
set total_hits to the Active Record result set size if the user gave any
active record conditions with his queries (see below).

But please keep in mind that total_hits still may be wrong under certain
circumstances - e.g. if you specify the :num_docs ferret option and some
active record conditions further limiting the result set.

result = Article.find_by_content(‘ruby’)

Result will contain 3 items and “total_hits” will return 3

However, if I add a condition:
result = Article.find_by_content(‘ruby’, {}, ‘visible = 1’)
Result will contain 2 items - which is correct

But “hotal_hits” will still return 3 - not what I would expect.

if results.any?
conditions = combine_conditions([ “#{table_name}.#{primary_key} in
(?)”, results.keys ],
find_options[:conditions])
result = self.find(:all,
find_options.merge(:conditions => conditions))
total_hits = result.length <===== ADD THIS!!!

even better, add

total_hits = result.length if find_options[:conditions]

so total_hits stays correct if you use any ferret options like :num_docs
instead of AR conditions to limit the result set.

cheers,
Jens


webit! Gesellschaft für neue Medien mbH www.webit.de
Dipl.-Wirtschaftsingenieur Jens Krämer [email protected]
Schnorrstraße 76 Tel +49 351 46766 0
D-01069 Dresden Fax +49 351 46766 66