Поиск открытых и закрытых часов работы с мыслящим сфинксом в рельсах 3.0 - PullRequest
0 голосов
/ 29 марта 2011

У меня есть интересная проблема, которая может быть, кто-то может решить.У меня есть бизнес-модель, которую я хочу найти, поэтому я подключаю ее к файлу think_sphinx, и теперь я могу искать.

Теперь моя бизнес-модель имеет много часов.

class Business
has_many :hours
define_index ...

class Hour
belongs_to :business

Моя таблица часов содержит следующие столбцы: business_id, day_of_week (int), open_time (время mysql), close_time (mysql_time).Еще одна проблема, усугубляющая проблему, заключается в том, что для каждого дня может быть несколько раз открытия / закрытия.Например: откройте понедельник 8: 00-12: 15 и 15: 00-20: 00

Если я хочу добавить фильтр на свой веб-сайт, чтобы отображать в поиске только открытые компании, есть ли способ, которым я могумогу индексировать мои часы в индекс сфинкса и искать через: с?

У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Это, вероятно, не идеально, но вы должны иметь возможность работать с поиском - однако, это будет через модель «Час», а не «Бизнес».

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

Это даст вам часовые объекты, сгруппированные по бизнес-идентификаторам, которые открыты, поэтому вы не получите дублирующиеся бизнесы.

Вся теория, но попробуй, дай мне знать, как у тебя дела:)

0 голосов
/ 29 марта 2011

Во-первых, вам нужно изменить модель часов на «own_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
...