Hash的条件映射,使用join来连接字符串

时间:2015-03-15 17:44:57

标签: ruby

我正在进行字符串连接:

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

你有建议如何解决我的问题吗?

1 个答案:

答案 0 :(得分:1)

我认为这是一个XY问题。我认为你应该这样做:

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

这将使用双引号而不是单引号来包围字符串,但我认为这不是问题。