私の検索には、価格帯、曜日、ゲスト数でクエリをスコープする機能が含まれています。
ただし、料金は曜日ごとに異なり、宿泊人数によって(直線的にではなく)変動します。データにインデックスを付けるために私が考えることができる最善の方法は、日/ゲストの組み合わせごとに異なるフィールドを作成することです。
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メソッドに空の値を返すようにする必要がありますか?私が知らない検索可能なブロックで利用可能なメカニズムはありますか?