2 votes

Rails SQL : Créer une requête de façon dynamique

J'essaie de créer une requête dynamique basée sur les entrées de l'utilisateur.

if a
  conditions << ["fname like (?)"]
  sql_params <<  "abc"
end
if b
  conditions << ["lname like (?)"]  
  sql_params <<  "def"  
end
if c
  cconditions << ["middle like (?)"]  
  sql_params <<  "xyz"   
end

results = Model.where(conditions.join(' AND '), sql_params)

Alors que les conditions sont dans une syntaxe correcte, les sql_params sont listés comme un tableau. Cela forme la requête suivante

Model.where("fname like (?) AND lname like (?) AND middle like (?)", ["abc","def","xyz"])

alors que ce dont j'ai besoin est

Model.where("fname like (?) AND lname like (?) AND middle like (?)", "abc","def","xyz")

J'ai essayé plusieurs options map/join etc sur le tableau sql_params mais rien n'a fonctionné.

2voto

Abdullah Points 1569

Vous devez passer sql_params con * (connu sous le nom de opérateur splat ), c'est-à-dire

results = Model.where(conditions.join(' AND '), *sql_params)

2voto

mu is too short Points 205090

Êtes-vous sûr de devoir produire exactement cela ?

Model.where("fname like (?) AND lname like (?) AND middle like (?)", "abc","def","xyz")

Quelque chose de cette forme :

Model.where('expr1 AND expr2 AND expr3')

est équivalent à :

Model.where('expr1').where('expr2').where('expr3')

alors pourquoi ne pas construire la requête morceau par morceau plutôt que de s'amuser avec des chaînes de caractères ? Quelque chose comme ça :

query = Model.all
query = query.where('fname  like ?', 'abc') if a
query = query.where('lname  like ?', 'def') if b
query = query.where('middle like ?', 'xyz') if c

vous donnera le même résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X