【问题标题】:Ruby on Rails associations for set theory (union, difference, intersection, etc.)用于集合论的 Ruby on Rails 关联(并集、差集、交集等)
【发布时间】:2010-04-06 18:06:57
【问题描述】:

我想要一个像这样工作的 has_many 关联:

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

class House
end

其中任何与 Hood 1 相关联的 House 也将返回到 Hood 1 的 subhoods 的 .houses,以及 subhoods 的个人关联。

协会只需要从胡德的角度工作。

我写了一个 union_with_parent 宏,它给出了预期的效果,但有很多不幸的副作用。一个主要问题是has_many :dependent => :destroy 导致了不可预见的删除;删除 subhood 也会导致删除父 Hood 中的所有房屋,因为我刚刚重新定义了 houses 方法。

设置差异宏的类似问题,除了 subhood 的房屋没有被摧毁。 (把它想象成一个掩码。那么一个 subhood 将包含父 Hood 中的所有房屋,除了那些在数据库中实际列为属于 subhood 的房屋。:dependent => :destroy 选项会导致所有父房屋被破坏,但没有一个那些在底层的,因为我们再次重新定义了房屋。我想要的行为:只有面具的内容被破坏。)

我曾想过编写一个has_many_union 宏,但看起来所有关联都非常复杂。

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

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

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

【问题讨论】:

    标签: ruby-on-rails metaprogramming associations set


    【解决方案1】:

    您不想将:dependent => :destroy 之类的内容与复杂的查找混为一谈。您可以保留 .houses 的代码,但添加一个简单的 has_many 关联来处理销毁:

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

    然后从.exclusive_housesparent.houses 或其他任何东西中构建.houses。这只会摧毁被摧毁引擎盖 ID 为 hood_id 的房屋。

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

    【讨论】:

    • 抱歉,您是对的。它应该是一个超级英雄。 =)
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2010-12-16
    • 1970-01-01
    • 2015-06-16
    • 2012-01-21
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多