2010-04-06 52 views
1

我想一個的has_many協會,就像這樣:Ruby on Rails的協會的集理論(工會,差集,交集等)

class Hood 
    acts_as_tree 
    has_many :houses, :union_with => :parent 
end 

class House 
end 

其中具有護罩1相關的任何房子也會在返回Hood 1的子女組合,以及子女的個人聯合組織。

該協會只需要從胡德的角度來工作。

我寫了一個union_with_parent宏,它給出了期望的效果,但很多不幸的副作用。一個主要問題是has_many :dependent => :destroy導致無法預料的刪除;因爲我剛剛重新定義了houses方法,刪除子集也導致刪除了父親胡德中的所有房屋。

類似的問題與設置的差異宏,除了沒有任何一方的房子被摧毀。 (把這個看作是一個面具,那麼一個子項目將包含父項目中的所有房子,除了數據庫中列出的屬於子項目的房子外,:dependent => :destroy選項會導致所有的父母房屋被銷燬,但是沒有一個因爲我們已經重新定義了房屋我想要的行爲:只有面具的內容被破壞。)

我想過編寫一個has_many_union宏,但它看起來像所有的關聯都很相關。

我在做這個蠢事嗎?有更容易的方法嗎?或者我應該徹底重新設計? (我真的不喜歡重新設計,因爲傳輸數據並不理想。)

(爲了記錄,是的,我知道這個比喻很糟糕,我的實際設計對大多數人來說都沒有意義,因爲它是生物信息學。)

也許你們都知道一些更好的方法來達到預期的效果?

回答

1

您不想將諸如:dependent => :destroy之類的東西與複雜的查找混合使用。你可以讓你的代碼爲.houses,但增加了一個簡單的has_many協會辦理的破壞:

has_many :exclusive_houses, :class_name => 'House', :dependent => 'destroy' 

,然後構建.houses.exclusive_housesparent.houses,或什麼的。這隻會摧毀被摧毀過的引擎蓋的ID爲hood_id的房屋。

另外,就你所知,你的例子對於集合論並沒有什麼意義。一個集合的元素包含在它的超集中,而不是它的子集。如果你實際上有一個嵌套集合結構,那麼可能比樹更好的架構。

+0

道歉,你是對的。它應該是一個超級。 =) – 2010-04-08 01:02:56