我想要一个像这样工作的has_many协会:
class Hood
acts_as_tree
has_many :houses, :union_with => :parent
end
class House
end
任何与胡德1相关的房屋也将在胡德1号的.houses
个子宫殿中返回,同时还有子世家的个人关联。
该协会只需要从胡德的角度出发。
我写了一个union_with_parent宏,它给出了预期的效果,但是有很多不幸的副作用。一个主要问题是has_many :dependent => :destroy
导致无法预料的删除;删除一个subhood也导致删除父Hood中的所有房屋,因为我刚刚重新定义了houses
方法。
类似的问题与设定的差异宏,除了没有一个subhood的房子被摧毁。 (把它想象成一个面具。那么一个subhood将包含父Hood中的所有房子,除了那些实际列在数据库中的属于subhood的房子。:dependent => :destroy
选项导致所有的父房子被摧毁,但是由于我们再次重新定义了房屋,所以我不想重新定义房屋。我想要的行为只有面具的内容被破坏了。)
我考虑过编写一个has_many_union
宏,但看起来所有的关联都非常复杂。
我这样做是愚蠢的吗?有没有更简单的方法?或者我应该彻底重新设计? (我真的不想重新设计,因为传输数据并不理想。)
(对于记录,是的,我知道这个比喻很糟糕。我的实际设计对大多数人来说没有意义,因为它是生物信息学。)
也许你们都知道一些更好的方法来达到预期的效果?
答案 0 :(得分:1)
您不希望将:dependent => :destroy
之类的内容与复杂的查找混合在一起。您可以保留.houses
的代码,但添加一个简单的has_many关联来处理破坏:
has_many :exclusive_houses, :class_name => 'House', :dependent => 'destroy'
然后从.houses
和.exclusive_houses
或其他任何内容构建parent.houses
。这只会摧毁被摧毁的引擎盖ID hood_id
的房屋。
另外,你知道,你的例子对集理论并没有意义。集合的元素包含在其超集中,而不是其子集中。如果你实际上有一个嵌套的集合结构,那么它可能比树更好的架构。