如何在Sunspot可搜索块中动态构造属性名称

时间:2012-01-10 23:54:24

标签: ruby-on-rails ruby-on-rails-3 sunspot sunspot-rails sunspot-solr

我的搜索功能包括按价格范围,星期几和访客计数来确定查询范围的功能。

但是,价格在一周中的每一天都不同,价格会根据客人数量而变化(不是线性)。我能想到的最好的数据索引方法是为每天/来宾组合创建一个不同的字段,例如,

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:未定义的方法`guests_min'用于#< Sunspot :: DSL ::字段:0x000001080bdcf0>

它没有抱怨常量Date :: DAYNAMES。

似乎Sunspot尝试将任何方法标记解释为字段。如果我更好地理解它,我想甚至会有意义。

所以,我的问题是,有一个聪明的方法让我这样做吗?我是否需要对范围进行硬编码并让我的price方法返回空值?在我不知道的可搜索块中是否有可用的机制?

0 个答案:

没有答案