Как динамически создавать имена атрибутов в поисковом блоке Sunspot - PullRequest
2 голосов
/ 11 января 2012

Мой поиск включает в себя возможность охвата запроса по ценовому диапазону, дню недели и количеству гостей.

Однако цена меняется в каждый день недели, и цена меняется (не линейно) в зависимости от количества гостей.Наилучший способ индексировать данные - создать отдельное поле для каждого комбо-дня / гостя, например,

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: неопределенный метод `guest_min 'для #

Он не жалуется на константу Date :: DAYNAMES.

Кажется, что Sunspot пытается интерпретировать любой маркер метода как поле.Что, я полагаю, имело бы смысл, если бы я понял это лучше.

Итак, мой вопрос, есть ли для меня разумный способ сделать это?Нужно ли просто жестко кодировать диапазон и позволить моему методу цены возвращать пустое значение?Есть ли какой-нибудь механизм в поисковом блоке, о котором я не знаю?

...