2010-01-12 4 views
1

J'ai une application rails (exécutée sur la version 2.2.2) qui a un modèle appelé Product. Le produit est dans une relation de type "a-et-appartient-à-plusieurs" avec Feature. Le problème est que j'ai besoin d'une fonctionnalité de recherche pour les produits. Donc, je dois être capable de rechercher des produits qui ont un nom similaire, et d'autres attributs. La partie délicate est que la recherche doit également retourner les produits qui ont l'ensemble exact de fonctionnalités indiquées dans le formulaire de recherche (ceci est représenté par un ensemble de cases à cocher). Le code suivant fonctionne, mais il me paraît assez inefficace:Construction d'une requête "appartenances multiples"

@products = Product.find(:all, :conditions=>["home=? AND name LIKE ? AND made_by LIKE ? AND supplier LIKE ? AND ins LIKE ?",hme,'%'+opts[0]+'%','%'+opts[1]+'%','%'+opts[3]+'%','%'+opts[4]+'%']) 


#see if any of these products have the correct features 
if !params[:feature_ids].nil? 
    f = params[:feature_ids].collect{|i| i.to_i} 
    @products.delete_if {|x| x.feature_ids!=f} 
end 

Je suis désolé que ma compréhension des rails/sql est si faible, mais que quelqu'un a des suggestions sur la façon d'améliorer le code ci-dessus? Merci beaucoup!

+0

Encore une chose: si ma réponse vous a aidé, s'il vous plaît marquer comme la réponse à votre question (la coche verte) :) 10qu –

Répondre

1

D'abord, je vous recommande d'écrire manuellement un modèle FeatureProduct (et ne pas utiliser la valeur par défaut « has_and_belongs_to_many ») EG

class FeatureProduct 
    belongs_to :feature 
    belongs_to :product 
end 

class Product 
    has_many :feature_products 
    has_many :features, :through => :feature_products 
end 

class Feature 
    has_many :feature_products 
    has_many :products, :through => :feature_products 
end 

Pour la recherche: Vous pouvez trouver la gemme SearchLogic être exactement ce que vous avoir besoin. Il a un support pour les conditions 'LIKE' (cela signifie que vous pouvez écrire de manière plus 'Rails' votre requête). Il prend également en charge l'exécution d'une recherche avec des conditions sur un modèle associé (sur votre modèle Feature, pour être plus précis).

La solution serait quelque chose comme:

search = Product.search 
search.name_like = opt[0] 
search.made_by_like = opt[1] 
... 
search.feature_products_id_equals = your_feature_ids 
.. 
@product_list = search.all 

Il y a aussi une excellent screencast expliquant l'utilisation de ce petit bijou.

Bonne chance :)

+0

Merci! J'ai effectivement regardé SearchLogic, et ça avait l'air génial. Cependant, il ne fonctionne apparemment pas très bien avec ma version de rails (que je ne suis pas autorisé à mettre à niveau). Votre réponse a été très utile, mais je suis encore en train de trouver les cordes ici, alors désolé, il m'a fallu si longtemps pour cliquer sur la flèche. – Anna

Questions connexes