0

好的,我整个早上都在想办法解决这个问题。假设您有一个如下所示的哈希:

{"luxury_shopper"=>"10", "movie_goer"=>"80"}

并且您想构建一个如下所示的查询:

Observation.search("something", boost_by: {biz_trv:{factor: 10}} && {day_com:{factor:100}})

到目前为止,我的方法是将传入的哈希转换为如下所示:

[{:luxury_shopper=>{:factor=>"10"}}, {:movie_goer=>{:factor=>"80"}}]

通过像这样遍历原始哈希:

params[:filter].map {|k,v| {k.to_sym => {factor:v}}}

我遇到的问题是,由于我尝试构建的查询由我将“boost_by”的未知数量的哈希组成,所以我不能只是做一些filters[0] && filters[1]我在这里被难住的事情。有谁知道我如何将哈希动态插入到我的查询中并将运算符放在它们之间?

编辑:

查询如下所示:

Observation.search("someting", boost_by: `insert hash` `insert operator` `insert hash` etc...)

上面的查询可以有任意数量的散列和运算符。因此,如果用户想将 10 个字段传递给 boost_by,我需要能够接受所有 10 个哈希以及它们之间的任何运算符,例如,我的查询可能类似于以下示例:

Observation.search("something", boost_by: {biz_trv:{factor: 10}})

Observation.search("something", boost_by: {biz_trv:{factor: 12}} && {day_com:{factor:50}} && {location:{factor:40}})
4

3 回答 3

3

我有一个解决方案,它涉及形成您的查询字符串,然后使用#send 方法将您的查询字符串传递给对象。

hash = {"luxury_shopper"=>"10", "movie_goer"=>"80"}
BLANK_PARAMS = "boost_by: "
params = BLANK_PARAMS
hash.each do |k, v|
  if params == BLANK_PARAMS
    params += "{#{k}: {factor: #{v}}}"
  else
    params += " && {#{k}: {factor: #{v}}}"
  end
end

在此操作结束时,params 字符串将如下所示:

"boost_by: {luxury_shopper: {factor: 10}} && {movie_goer: { factor: 80}}"

因此,如果您现在想运行以下命令:

Observation.search("something", boost_by: {luxury_shopper: {factor: 10}} && {movie_goer: {factor: 80}})

您可以使用 #send 这样做:

Observation.send('search', 'something', params)
于 2015-06-03T02:43:52.410 回答
1

我不确定是否正确理解您的问题,但如果您需要&&在任意数量的元素之间应用,您可以简单地使用Enumerable#all? 方法,比如

filters = [{biz_trv:{factor: 10}}, {day_com:{factor:100}}, …]
Observation.search("something", boost_by: filters.all?)

更新:

filters = [{biz_trv:{factor: 12}}, {day_com:{factor:50}},
           {location:{factor:40}}]
Observation.search("something",
                   boost_by: filters.inject {|ac,e| ac && e})
于 2015-06-02T20:18:34.840 回答
0

假设您总是想使用相同的运算符,您希望将您的输出传递map给行为类似于inject

(params[:filter].map {|k,v| {k.to_sym => {factor:v}}}).inject() { |r,c| r && c }

注意:未经测试!

于 2015-06-02T21:56:36.090 回答