2011-01-25 32 views
1

我試圖使搜索很複雜的複雜搜索(當然,爲了使用戶更容易)有多種型號的Geokit使用Rails

我有一個應用程序有3種型號:廣告活動,企業和位置

像這樣:

\\ campaign.rb 
    belongs_to :business 
    has_many :locations, :through => :business 
    acts_as_mappable 

\\ business.rb 
    has_many :campaigns 
    has_many :locations 

\\ location.rb 
    belongs_to :business 
    has_many :campaigns, :through => :business 
    acts_as_mappable 

這種設置方式,也有一些企業,有多個位置。對於那些沒有的,geokit信息被編碼到活動數據庫條目中。對於那些確實有多個位置的人,geokit信息被編碼到位置數據庫條目中。

我正在嘗試搜索將在特定距離內返回結果的廣告系列。處理擁有單一地址的企業時,這很簡單。

Campaign.find(:all, 
     :conditions => [blahblahblah], 
     :origin => address, 
     :within => distance 
     ) 

但是,我還想要包含屬於具有多個位置的企業的廣告系列。我想要搜索返回該廣告系列的結果,如果該業務具有多個位置,並且這些位置中的任何位置都在該範圍內。我在想:

Campaign.find(:all, 
     :include => [:business, :locations] 
     :conditions => [blahblahblah], 
     :origin => address, 
     :within => distance 
     ) 

但是,對於屬於具有多個位置的企業的廣告系列,這不會返回任何結果。當談到SQL時,我是一個noob,因此我不確定如何在一個模型(Campaign)中使用rails搜索,並搜索另一個模型(業務模型)以從Location模型中獲取結果。涉及geokit的事實使其變得更加複雜。

我想:在campaign.rb acts_as_mappable :through => :locations,但它只是把SQL錯誤

我有一個多態模型「可尋址」搞砸左右,但我發現我幾乎必須從地面啓動的其他型號的控制器。

我也想過named_scopes,但我相信geokit不支持它們。

有什麼建議嗎?

+0

你有使用Geokit?我創建了一個類似的搜索機制,用戶可以輸入多個位置和半徑,並在其邊界相交處顯示匹配。出於性能原因,我在SQL中進行所有計算。如果你認爲他們可能有所幫助,我會在以後發佈問題嗎 – dangerousdave 2011-01-26 15:31:17

+0

我想我不必使用geokit,但計算似乎對我來說有點意思,更不要說地址轉換成lat,lng座標 – goddamnyouryan 2011-01-27 04:04:48

回答

1

如果你認爲你的模型過於複雜,它是一個很好的信號,它需要重新設計。

是否有可能沒有商業活動?如果不是,那麼如果業務已經具有可映射位置,那麼製作廣告系列act_as_mappable(假設您的廣告系列數據庫包含lat和lng列)沒有任何意義。

如果廣告系列與具有多個地理位置的商戶關聯,那麼該廣告系列的位置是什麼?您在campaign.lat和lng屬性中存儲了哪些內容?

如果您選擇您的數據模型堅持,我推薦給你的搜索分解成多個命令:

def find_campaigns_near(origin,distance) 
    locations = Location.find(:all, 
      :origin => address, 
      :within => distance 
    ); 
    # use Hash for uniqueness based on id 
    campaigns = Hash.new 
    locations.each do |location| 
     location.campaigns.each do |campaign| 
      campaigns[campaign.id] = campaign if campaigns[campaign.id].blank? 
     end 
    end 
    campaigns 
end