2010-07-26 4 views
4

Est-il possible d'exécuter une requête find_by en utilisant une instruction 'or'? Par exemple:Enregistrement actif Recherche par colonne Rails 'OU'

@product ||= Product.find_by_upc(params[:code]) if params[:code] 
@product ||= Product.find_by_cspc(params[:code]) if params[:code] 

Comme quelque chose comme (ne fonctionne pas):

@product ||= Product.find_by_upc_or_cspc(params[:code]) if params[:code] 

Merci!

+0

Comment prendriez-vous une de ces réponses et de créer un 'Product.find_by_code'? – Meekohi

Répondre

9

Ne pas utiliser les méthodes activerecord

Cela pourrait fonctionner:

code = params[:code] 
@product = Product.find(:all, :conditions => ["upc = ? or cspc = ?", code, code]) 
+0

Merci Nicholas! Exactement ce que je cherchais. –

1

Pour autant que je sais Rails ne supporte pas automatique ou moteurs de recherche, hors de la boîte. Mais la gemme searchlogic semble prendre en charge cette fonctionnalité. Voir here

+0

Ouais, c'était ce que je pensais. J'ai jeté un coup d'oeil à la gemme de recherche-logique et l'ai utilisée dans le passé. Merci pour la réponse. –

1

J'ai déjà eu un problème similaire avant. Une façon de l'aborder est d'essayer de comprendre quel type de données vous obtenez en premier lieu. Écris du code qui te dira la différence.

Peut-être voir s'il y a une façon regex de faire la distinction entre UPC et CSPC.

+0

Bon point. Je pourrais jeter un oeil à l'ajout d'un contrôle de longueur (les codes UPC-A sont tous les 12 caractères, et CSPC sont 6 ou 7, je crois). Merci. –

4

Nettoyage du code de nicholas:

@products = Product.all(:conditions => ["upc = :code or cspc = :code", {:code => params[:code]}]) 
+0

Merci Omar pour le joli réfracteur. J'ai fini par faire ça pour nettoyer un peu le code. –

1

Si vous utilisez Arel on Rails 3:

t = Product.arel_table 

@products = Product.where(
    t[:upc].eq(params[:code])  \ 
    .or(t[:cspc].eq(params[:code])) 
) 

@product = @products.first if @products.size == 1 
Questions connexes