searching on model and related attributes

Hi all,

Haven't played with rails for a while so I'm a little stuck. I've got to make a search functionality across models.

Let me try to explain this (sorry for lack of clarity, I've been reading so many search gems etc that I'm a little fuzzy now):

* Stores have town and county fields * Stores has_many Products which each have their own name and level

Users need to be able to find all Stores (possibily limited by town or county) which have one or more Products identified by name AND a minimum level.

So I might search for Stores which have the Product 'Small Wooden Table' with a level of at least 4 AND have the Product 'Oak Table' at least level 10. Then I might restrict that to Stores in the county of 'Yorkshire'.

The list of Products is pretty long (300+) and I don't think it would be user friendly to put them in a long drop-down list, so I'm tempted to let users type in the name and level manually. If they don't type the name correctly, then I guess they won't get the right results.

I've looked at several gems (including searchlogic and ransack) but none seem to give me the ability to search related models in this way. I might have to knock together something from scratch but I don't want to end up being hideously inefficient.

Grateful for any pointers on this, and please let me know if I haven't explained it well enough.

Many thanks

Hi all,

Haven't played with rails for a while so I'm a little stuck. I've got to make a search functionality across models.

Let me try to explain this (sorry for lack of clarity, I've been reading so many search gems etc that I'm a little fuzzy now):

* Stores have town and county fields * Stores has_many Products which each have their own name and level

Users need to be able to find all Stores (possibily limited by town or county) which have one or more Products identified by name AND a minimum level.

So I might search for Stores which have the Product 'Small Wooden Table' with a level of at least 4 AND have the Product 'Oak Table' at least level 10. Then I might restrict that to Stores in the county of 'Yorkshire'.

The list of Products is pretty long (300+) and I don't think it would be user friendly to put them in a long drop-down list, so I'm tempted to let users type in the name and level manually. If they don't type the name correctly, then I guess they won't get the right results.

How big is your data. If you've only got a couple of hundred stores to go with those products then something like

Select * from stores Inner join products_stores on store_id = stores.id Inner join products on products.id = product_id Where products.name = 'small wooden table' and level > 4 and location = "yorkshire"

Should work. You could loosen the condition on name to make it more user friendly (in which case you might want to chuck a 'distinct' in) or provide an autocomplete for the product name.

Beyond a certain point you might fid it better to go for a full blown searchengine like elasticsearch which would make the product name searching bit more powerful while still remaining fast with large amounts of data

Fred