我有一个有趣的问题,也许有人可以弄清楚。我有一个我想要搜索的商业模式,所以我将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索引并通过以下方式搜索:
任何人都有任何想法如何解决这个问题?
答案 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