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