2015-03-15 3 views
0

que je fais concaténation de chaîne:carte conditionnelle de Hash avec joindre à concaténer une chaîne

aql_string = "FILTER user." 
aql_string << conditions.map { |attr, value| "#{attr} == '#{value}'" }.join(" && user.") 

conditions peut être { :foo => 'bar', :rating => 42 }, auquel cas le résultat est:

FILTER user.foo == 'bar' && user.rating == '42' 

Malheureusement, la requête la langue derrière FILTER ... n'accepte pas les chaînes si l'attribut (user.rating ici) est affecté Integer.

Donc je dois éliminer les guillemets simples autour de #{value} si value est un Integer. J'ai essayé de créer une condition comme if value.class == Fixnum. Cependant, je ne sais pas comment utiliser cette condition dans conditions.map parce que join ne fonctionne que de cette façon.

J'ai essayé de faire quelque chose comme:

aql_string << conditions.map do |attr, value| 
    if value.class == Fixnum 
    "#{attr} == #{value}" }.join(" && user.") 
    else 
    "#{attr} == '#{value}'" }.join(" && user.") 
end 

mais cela soulève une erreur: undefined method `join' for "foo == 'bar'":String.

Avez-vous un conseil pour résoudre mon problème?

Répondre

1

Je crois qu'il s'agit d'une question XY. Je pense que vous devriez le faire de cette façon:

aql_string = "FILTER " << 
conditions.map{|k, v| "user.#{k} == #{v.inspect}"}.join(" && ") 

Ce entourera cordes avec des guillemets doubles au lieu de guillemets simples, mais je crois que c'est pas un problème.

+0

Fonctionne parfaitement, merci beaucoup! – Klaus