2011-03-29 35 views
0

思維斯芬克斯營業時間我有一個有趣的問題,也許有人可以找出。我有一個我想要搜索的業務模型,所以我將thinking_sphinx掛鉤到它中,現在我可以搜索。搜索打開和關閉與導軌3.0

現在我的商業模式的has_many小時。

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

這可能是不理想的,但你應該能夠得到一個搜索工作 - 但是,它會通過小時模式,而不是商業模式。

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 

我不能肯定,對時代的鑄造 - 但實際上,我們只是希望被處理的整數,獅身人面像沒有時間數據類型。

搜索可能會是這個樣子:

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分組是開放小時的對象 - 所以你不會得到重複的商家。

所有的理論,但給它一個旋轉,讓我知道你是如何去:)

+0

針對BusinessHour模型進行這項工作時,我如何處理營業時間不是他們唯一過濾的情況。例如他們正在按商業名稱,類別和時間搜索? – gduq 2011-11-08 13:55:07

+0

您需要具有通過關聯來繪製這些數據段的字段或屬性,就像上面針對企業名稱所做的那樣。然後可以使用:with(for attributes)或:conditions(for fields)來相應地進行過濾。 – pat 2011-11-09 02:45:35

+0

我原本返回了比需要更多的業務成果,然後檢查它們是否在內存中打開/關閉。寫得很差,速度很慢。我終於開始實施你的方法,它運作良好。並非所有的企業都有幾個小時,所以我有兩個不同的指數。對於普通查詢,我使用正常的business_index,並在選擇打開/關閉過濾器時使用hours_index。謝謝帕特。 – ayeezy 2012-03-12 22:51:05

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 
+0

感謝您的答覆。我編輯了我的問題以正確顯示belongs_to。無論如何,我並沒有真正想弄清楚一個企業是否開放,而是將獅身人面像搜索與只顯示開放式業務集成在一起。也許我不明白你的答案,但你定義了一個索引,但沒有告訴我如何使用它。 – ayeezy 2011-03-30 07:59:54

+0

我不知道獅身人面像,但我認爲基於上[的文檔(http://sphinxsearch.com/docs/1.10/sphinxql-select.html)所生成的過濾器上面會爲獅身人面像的工作。我不知道它是否直接映射到Ruby api。 – ricaurte 2011-04-02 11:13:40