On 10/19/06, Jon <[EMAIL PROTECTED]> wrote:
> I realized that I wasn't fully clear in this example...I would want
> returned all Book objects where the Book description contains the word
> 'programming', the Author name contains the word 'Smith', AND (what I
> didn't explicitly say before) the book is by that author.  So more
> informally, I want to find all programming books who are by someone with
> 'Smith' in their name.  This would amount to the extra join statment of
> 'books.author_id=author.id'.  I'm having a really hard time figure out
> how to do this in Ferret (using acts_as_ferret).
>
> Jon wrote:
> > I'm having trouble figuring out how to do Ferret queries across multiple
> > tables as you would in a normal SQL call.  For example, let's say I have
> > two ActiveRecord classes, Book, and Author, where Book has a
> > 'description' field and Author has a 'name' field, and where Book has a
> > belongs_to relationship with Author (Book belolngs to Author, Author
> > has_many Books).  Let's say I'd like to find all Books with the term
> > 'programming' in their description that are by people with 'Smith' in
> > their name.  I'd like to do something like this:
> >
> > Book.find_by_contents("books.description:programming AND
> > authors.name:Smith",
> >                       {},
> >                       {:include => :author})
> >
> > However, this function does not seem to allow the specification of table
> > names.  This type of call would be relatively easy in plain SQL, but I'd
> > like to use Ferret for all queries to keep things uniform and to take
> > advantage of its speed.  I've looked into using the multi_search option
> > also, but can't figure out how to use it to do even simple joins such as
> > this one.  Any help would be greatly appreciated.  Thanks.

Hi Jon,

Ferret isn't a database (yet?[1]). If you need to run queries like
this then you should index the author name in the book document and
forget about doing joins for the moment. Queries will be a lot faster
this way too. I think this is pretty easy in acts as ferret. Just
define the method author_names

    def author_names
        authors.map{|author| author.name}
    end

And make sure :author_names is in your list of fields to index.

Cheers,
Dave

[1] http://www.mail-archive.com/[email protected]/msg01183.html
_______________________________________________
Ferret-talk mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/ferret-talk

Reply via email to