Ruby on rails Rails关联+继承

Ruby on rails Rails关联+继承,ruby-on-rails,ruby,class,inheritance,associations,Ruby On Rails,Ruby,Class,Inheritance,Associations,我很难决定如何使用rails关联对以下内容进行建模 UML将如下所示: ---------------- | CRITERIA | ---------------- | |* ---------------- | CONTROLS | <___ ---------------- \ ^ \ | \ ------------------- -------

我很难决定如何使用rails关联对以下内容进行建模

UML将如下所示:

----------------
|   CRITERIA   |
----------------
       |
       |*
----------------
|   CONTROLS   | <___
----------------     \
      ^               \
      |                \
-------------------    -------------------
|   SCALE CONTROL |    |  TEXT CONTROL   |      .....
-------------------    -------------------
并能够按照以下方式进行查询:

criteria.controls  
# displays all controls (text, scale, etc.) 

criteria.controls.each { ... }
到目前为止,我看到的是: -RailsCasts关于多态关联的插曲,似乎这不是一个好的用例。 -数十个rails协会在这里发布帖子,但都没有找到任何直接相关的内容。 -Rails文档


在Rails中实现上述内容有什么共同的模式吗?

您的多态性设置很好,但Rails无法帮助您。你有两个选择。自己编写方法:

class Criteria

  def controls
    scale_controls + text_controls
  end

  def scale_controls
    ScaleControl.where(criteria_id: id)
  end

  def text_controls
    TextControl.where(criteria_id: id)
  end
end
或者可以实现反向多态联接表。听起来很可怕,但也不算太糟

class CriteriaControl < ActiveRecord::Base
  belongs_to :criteria
  belongs_to :control, polymorphic: true # so it must include both a control_id and control_type in its table schema
end
但真正的问题是为什么Rails不能写这个


当Rails构建关联时,它只是对底层SQL的抽象。在这里,Rails无法收集所有控件,因为它不知道要查看哪些表。它首先从criteria_控件执行SELECT*,其中criteria_id=231231。然后,它可以使用控件类型和控件id在各自的表中查找各个控件。

您的多态设置很好,但Rails无法帮助您。你有两个选择。自己编写方法:

class Criteria

  def controls
    scale_controls + text_controls
  end

  def scale_controls
    ScaleControl.where(criteria_id: id)
  end

  def text_controls
    TextControl.where(criteria_id: id)
  end
end
或者可以实现反向多态联接表。听起来很可怕,但也不算太糟

class CriteriaControl < ActiveRecord::Base
  belongs_to :criteria
  belongs_to :control, polymorphic: true # so it must include both a control_id and control_type in its table schema
end
但真正的问题是为什么Rails不能写这个

当Rails构建关联时,它只是对底层SQL的抽象。在这里,Rails无法收集所有控件,因为它不知道要查看哪些表。它首先从criteria_控件执行SELECT*,其中criteria_id=231231。然后它可以使用控件类型和控件id在各自的表中查找各个控件。

Relevant:Relevant: