2010-12-04 4 views
0
def self.search(search) 
    if search 
    where('name OR username OR bio LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

Le code ci-dessus fonctionne très bien sur mon serveur de développement en utilisant SQLite, mais comme Heroku utilise PostgreSQL il se casse (semble que vous ne pouvez utiliser « OU » dans les requêtes vraiment booléennes).multi-colonne simple-Recherche de SQLite à Heroku/PostgreSQL

Existe-t-il une meilleure façon d'implémenter cette simple recherche pour qu'elle fonctionne avec PostgreSQL ou dois-je passer à une solution de recherche plus complexe?

+0

Essayez-vous de trouver un objet qui a (nom LIKE search) ou (nom d'utilisateur LIKE search) ou (recherche bio LIKE)? –

Répondre

1

Vous cherchez quelque chose comme ça?

def self.search(search) 
    if search 
    where('name IS NOT NULL OR username IS NOT NULL OR bio LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

Si name et username peut être NULL ou vide, alors vous aurez envie d'utiliser COALESCE:

def self.search(search) 
    if search 
    where("COALESCE(name, '') <> '' OR COALESCE(username, '') <> '' OR bio LIKE ?", "%#{search}%") 
    else 
    scoped 
    end 
end 

Ceux-ci devraient travailler même dans SQLite et PostgreSQL.

+0

Je ne sais pas quel langage de programmation est et comment le littéral SQL est traduit, mais l'utilisation de guillemets pour les caractères littéraux n'est pas une syntaxe valide dans PostgreSQL (et la plupart des autres SGBD) –

+0

Bon, merci @a_horse_with_no_name, j'ai eu mon single et double quotes à l'envers. Mes langues sont parfois confuses; Je suppose que ça va m'apprendre à ne pas vérifier mon travail. J'ai inversé les guillemets alors Ruby, PostgreSQL et SQLite devraient tous être heureux maintenant. –