2

私の検索には、価格帯、曜日、ゲスト数でクエリをスコープする機能が含まれています。

ただし、料金は曜日ごとに異なり、宿泊人数によって(直線的にではなく)変動します。データにインデックスを付けるために私が考えることができる最善の方法は、日/ゲストの組み合わせごとに異なるフィールドを作成することです。

searchable do
  integer :price_sunday_2_guests do
    price(:sunday, 2)
  end
  integer :price_sunday_3_guests do
    price(:sunday, 3)
  end

  ...

  integer :price_monday_2_guests do
    price(:monday, 2)
  end

  ... 

  # and so on...

end

明らかに、すべてを入力したくはありません。検索可能なブロックにこれらの属性を作成したいと思います。もっと好き:

searchable do
  Date::DAYNAMES.each do |day_name|
    day = DateTime.strptime(day_name, '%A')
    (guests_min..guests_max).each do |guests|
      sym = (day_name.downcase + '_' + guests.to_s + 'guests_price_abs_max').to_sym
      integer sym do
        price(day_name, guests)
      end
    end
  end
end

しかし、次の例外が発生します。NoMethodError:#<Sunspot :: DSL :: Fields:0x000001080bdcf0>の未定義のメソッド `guests_min'

定数Date::DAYNAMESについては文句を言いません。

Sunspotは、メソッドトークンをフィールドとして解釈しようとしているようです。それをもっとよく理解すれば、それは理にかなっていると思います。

それで、私の質問ですが、これを行うための賢い方法はありますか?範囲をハードコーディングして、priceメソッドに空の値を返すようにする必要がありますか?私が知らない検索可能なブロックで利用可能なメカニズムはありますか?

4

0 に答える 0