我正在进行字符串连接:
aql_string = "FILTER user."
aql_string << conditions.map { |attr, value| "#{attr} == '#{value}'" }.join(" && user.")
其中conditions
可能是{ :foo => 'bar', :rating => 42 }
,在这种情况下,结果是:
FILTER user.foo == 'bar' && user.rating == '42'
不幸的是,FILTER ...
背后的查询语言如果属性(user.rating
此处)被分配了Integer
,则不接受字符串。
如果#{value}
是value
,我必须删除Integer
周围的单引号。我试图创建一个像if value.class == Fixnum
这样的条件。但是,我不知道如何在conditions.map
中使用此条件,因为join
只能这样运作。
我尝试过这样的事情:
aql_string << conditions.map do |attr, value|
if value.class == Fixnum
"#{attr} == #{value}" }.join(" && user.")
else
"#{attr} == '#{value}'" }.join(" && user.")
end
但这会引发错误:undefined method `join' for "foo == 'bar'":String
。
你有建议如何解决我的问题吗?
答案 0 :(得分:1)
我认为这是一个XY问题。我认为你应该这样做:
aql_string = "FILTER " <<
conditions.map{|k, v| "user.#{k} == #{v.inspect}"}.join(" && ")
这将使用双引号而不是单引号来包围字符串,但我认为这不是问题。