通过在rails 3.0中思考sphinx来搜索打开和关闭工作时间

时间:2011-03-29 00:45:18

标签: ruby-on-rails ruby indexing sphinx thinking-sphinx

我有一个有趣的问题,也许有人可以弄清楚。我有一个我想要搜索的商业模式,所以我将thinking_sphinx挂钩到它,现在我可以搜索。

现在我的商业模式已经超过了几个小时。

class Business
has_many :hours
define_index ...

class Hour
belongs_to :business

我的小时表包含以下列:business_id,day_of_week(int),open_time(mysql time),close_time(mysql_time)。使问题复杂化的另一个问题是每天可能有多个打开/关闭时间。例如:周一8:00-12:15和15:00-20:00

开放

如果我想在我的网站上添加一个过滤器,只在搜索中显示打开的商家,有没有办法可以将我的小时数编入sphinx索引并通过以下方式搜索:

任何人都有任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这可能并不理想,但您应该能够进行搜索 - 但是,它将通过小时模型,而不是商业。

define_index do
  indexes business.name, :as => :business

  has business_id
  has day_of_week
  has 'CAST(open_hour AS INT)',  :as => :open_hour,  :type => :integer
  has 'CAST(close_hour AS INT)', :as => :close_hour, :type => :integer
end

我不确定时间的转换 - 但实质上我们只想处理整数,Sphinx没有时间数据类型。

搜索可能看起来像这样:

now  = Time.zone.now
time = (now - now.beginning_of_day).to_i
Hour.search 'foo',
  :with => {
    :day_of_week => now.wday,
    :open_hour   => 0..time,
    :close_hour  => time..240000
  },
  :group_by       => 'business_id',
  :group_function => :attr

这将使您按照业务ID分组的小时对象打开 - 这样您就不会获得重复的业务。

所有的理论,但是给它一个旋转,让我知道你如何去:)

答案 1 :(得分:0)

首先,您需要将您的小时模型更改为“belongs_to”而不是has_one,以便小时模型知道它直接链接到附加的业务。您可能还希望将open_time,close_time和day_of_week列编入索引,以便您可以快速搜索它们。

add_index :hours, [:day_of_week, :open_time, :close_time]

为了找到开放的业务,您可以创建一个如下所示的范围。我假设你正在使用ActiveRecord。

class Hour < ActiveRecord::Base
  belongs_to :business

  scope :open, lambda { |day, time| { :conditions => ["hours.day_of_week = ? AND hours.open_time >= ? AND hours.close_time < ?", day, time, time] } }
end

通过这种方式找到您必须要做的开放式业务:

Hour.open.includes(:business)

每个开放的业务都将附加到他们的营业时间模型。如果您想迭代它们并访问业务信息,您可以这样做:

Hour.open.includes(:business).each do |hour|
  puts "#{hour.business.name} is open! It closes at #{hour.close_time}."
end