[英]Rails Associations + Inheritance
我在决定如何使用Rails关联建模以下方面遇到麻烦。
UML如下所示:
----------------
| CRITERIA |
----------------
|
|*
----------------
| CONTROLS | <___
---------------- \
^ \
| \
------------------- -------------------
| SCALE CONTROL | | TEXT CONTROL | .....
------------------- -------------------
-各种控件具有完全不同的属性,因此STI似乎是一个糟糕的选择。
-用户可以根据条件指定任意数量的控件。
我想做以下事情:
Criteria
has_many :controls
ScaleControl
belongs_to :criteria, as: control
TextControl
belongs_to :criteria, as: 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
现在,两个控件has_one :criteria_control
和has_one :criteria, :through => :criteria_control
。
然后使用条件has_many :criteria_controls
,您可以这样定义控件方法:
def controls
criteria_controls.map(&:control)
end
但是真正的问题是“ Rails为什么不能写出来?”
当Rails建立关联时,它只是对基础SQL的抽象。 在这里,Rails无法收集所有controls
因为它不知道要查找哪些表。它首先执行SELECT * FROM criteria_controls WHERE criteria_id = 231231
。 然后,它可以使用control_type
和control_id
在各自的表中查找各个控件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.