2010-02-27 96 views
0

現在我正在處理有關激烈的acts_as_tree MySQL通過rails查詢的問題。我所查詢的模型是Foo。 A Foo可以屬於CityStateCountry中的任何一個。我的目標是根據他們的位置查詢Foo。我的位置表設置像這樣:超級超級acts_as_tree rails查詢

  • 我有我的數據庫中的表稱爲locations
  • 我用acts_as_tree和多態關聯的組合來存儲每個人的位置無論是作爲CityStateCountry。 (這意味着,我的表由行idnameparent_idtype的)

比方說,例如,我想在該州「加利福尼亞」查詢Foo秒。除了直接屬於「加利福尼亞州」的Foo之外,我應該在「洛杉磯」和「舊金山」中獲得屬於「加利福尼亞州」中的每個City的所有Foo s,如Foo s。不僅如此,我還應該得到屬於Country的任何Foo,即「加利福尼亞」在「美國」。

我試過幾個關聯的東西都無濟於事。我覺得我在這裏錯過了一些超級有用的Rails-fu。有什麼建議?

回答

0

我相信你已經找到了這樣的一個解決方案現在....

對於這樣的,我覺得我求助於非規範化盛大祖先和超越的東西。雖然它不是最好的數據庫實踐,但只需一點點的開銷就可以讓用例更容易。

因此,例如,您的位置表將包含city_id,state_id和country_id列,並且在類型爲「狀態」的情況下,city_id爲空。而對於type =「country」,city_id和state_id爲空。然後,在任何時候查詢查找給定節點的所有子節點都很簡單,您只需知道您之後的節點類型。

一個簡單的before_save可以做非規範化。

belongs_to :city, :class_name => "Location", :foreign_key => :city_id 
belongs_to :state, :class_name => "Location", :foreign_key => :state_id 
belongs_to :country, :class_name => "Location", :foreign_key => :country_id 

#might want to throw in some validation that one of the ids is set... 
def before_save 
    self.state_id = self.city.state_id if city_id && city 
    self.country_id = self.state.country_id if state_id && state 
end 

或者你可能想看看像嵌套集的實現,與另外兩個整型字段(左,右),可以讓你得到所有的子節點的層次結構中的任何節點我最喜歡的一個是http://github.com/collectiveidea/awesome_nested_set