【问题标题】:Rails 3 Models containing Themselves?Rails 3 模型包含自己?
【发布时间】:2011-06-03 12:36:19
【问题描述】:

我目前正在努力制作一个嵌套类型的对象模型,我很好奇我将如何使用 Rails 3 处理这个问题。

基本上我有以下几点:

  • 断言
  • Expression_Group
  • 表达式

断言由 1-N 个 Expression_Groups 组成。 Expression_Groups 由 1-N 个表达式组成。 ORM 对我来说棘手的部分是,Expression_Groups 也可能由其他 Expression_Groups 组成。

想象一个 SQL SELECT 并假设我们正在构建 WHERE 子句。

((V > 2 AND X = 0) OR (Y > 2 OR (Z = 4 OR S <> 2)))

当看到类似的东西时,我们可以把它分解并说:

 Z = 4 - Expression
(Z = 4 OR S <> 2) - Expression Group
(Y > 2 OR (Z = 4 OR S <> 2)) - Expression Group CONTAINING Expression AND Expression_Group

等等。我想做的是让用户能够构建该结构。我想使用 Rails 3 并以这样一种方式构建我的模型,这样我就不必滚动你自己的处理器并且可以简单地使用它们的形式。

我知道如何设置每个关系,除了包含 Expression_Groups 的 Expression_Groups。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    【讨论】:

    • 不,我没有。我看到了他们的例子,这让我相信我会把它放在指向 :ExpressionGroup 的断言类中。那是对的吗?他们的例子是有道理的,但是当我把它与 has_and_belongs_to_many 的措辞放在一起时,我不能把它串起来。那么一个Assertion 有ExpressionGroup 并且属于很多ExpressionGroups?或者这是否推断出 ExpressionGroups 属于许多其他 ExpressionGroups?
    • 如果我正确理解您的问题,ExpressionGroup has_and_belongs_to_many :expression_groups and belongs_to :assertion and has_many :expressions, Assertion has_many :expression_groups, and Expression belongs_to :expression_group
    • 我相信您已经总结得很好 - 现在我从您的描述中看到,您的意思是 ExpressionGroup 的 has_and_belongs_to_many。我也要试试!谢谢!
    【解决方案2】:

    假设ExpressionGroup 对象之间存在潜在的一对多关系,这样的关联可能会起作用:

    has_many :child_expression_groups,
             :class_name => "ExpressionGroup",
             :foreign_key => "parent_id",
             :dependent => :destroy
    

    请注意,这将需要一个新字段 - parent_id 在您的 expression_groups 表中允许为 null 并包含父 ExpressionGroup 的 ID(如果有父)。

    然后,您可以通过仅检索系统中将parent_id 设置为nil 的那些(或在ExpressionGroup 中为此定义范围)来获取所有顶级 表达式组型号)。

    如果您需要更高级的处理方式(例如将其设置为 多对多 等),请考虑使用 Ancestry 之类的东西。

    【讨论】:

    • 我的 expression_groups 表中确实有一个 parent_id,但我没有像你那样的关系。我会试一试。谢谢!
    • 太好了,祝你好运!就像我说的,如果你想更深入一点,我强烈建议使用提供更高抽象级别的东西(比如 Ancestry)。但是,如果您的需求很简单,那么这样的事情就足够了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2011-06-10
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多