Ruby on Rails关于集合论的联合(联合,差异,交集等)

时间:2010-04-06 18:06:58

标签: ruby-on-rails metaprogramming associations set

我想要一个像这样工作的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宏,但看起来所有的关联都非常复杂。

我这样做是愚蠢的吗?有没有更简单的方法?或者我应该彻底重新设计? (我真的不想重新设计,因为传输数据并不理想。)

(对于记录,是的,我知道这个比喻很糟糕。我的实际设计对大多数人来说没有意义,因为它是生物信息学。)

也许你们都知道一些更好的方法来达到预期的效果?

1 个答案:

答案 0 :(得分:1)

您不希望将:dependent => :destroy之类的内容与复杂的查找混合在一起。您可以保留.houses的代码,但添加一个简单的has_many关联来处理破坏:

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

然后从.houses.exclusive_houses或其他任何内容构建parent.houses。这只会摧毁被摧毁的引擎盖ID hood_id的房屋。

另外,你知道,你的例子对集理论并没有意义。集合的元素包含在其超集中,而不是其子集中。如果你实际上有一个嵌套的集合结构,那么它可能比树更好的架构。