繁体   English   中英

Rails协会+继承

[英]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_controlhas_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_typecontrol_id在各自的表中查找各个控件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM