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 に答える