我如何在ActiveRecord中拥有异构集合?

时间:2015-10-06 05:33:57

标签: ruby-on-rails ruby activerecord sti

我对Rails有点新鲜,来自Java,所以我可能完全不在这里,但这就是我想要做的事情:

我有一个包含其他对象集合的A类。该集合可以包含B,C和/或D对象。重要的是,

  1. B实际上是一个类族的父类(可能是 通过STI和JSONB数据存储实现差异)

  2. C和D由一个或多个B组成,但仍会响应 与B相同的方法(即B,C和D有鸭型方法)。

  3. 从A的实例中,我希望能够拨打@ a.collection [2] .do_this并拨打相应的#do_this。

    考虑到这一点,我在网上查看示例,并且最接近我能看到的是经典的:多态的例子,帖子,视频等共享一个评论类。然而,这似乎与我想要的相反(多对一而不是一对多)。我向后看还是什么?或者我可以做一些外键关键的事情并欺骗ActiveRecord进行多重继承?我已经浏览了MTI的Enterprise Rails章节,但我希望在这种情况下能够采用更简单/更适合的方式。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以利用MTI并使用source执行方法#do_this,为此您需要查看源类型和源类型方法。我正在严格通过活动记录进行讨论

has_many :related_tickers
has_many :catalysts,  through: :related_tickers, source: :companiable, source_type: "Catalyst"
has_many :strategic_initiatives,  through: :related_tickers, source: :companiable, source_type: "StrategicInitiative"
has_many :projects,  through: :related_tickers, source: :companiable, source_type: "Project"

现在您可以通过related_tickers加载内容并通过该模型调用#do_this方法。在ruby中,如果你已经在每个类中实现了相同的方法,那么应该根据duck类型执行,指示方法是否可以通过将运行的对象进行响应。您也可以使用eval和send方法来减轻编程站点的负担。希望这有帮助,但如果没有,请给我具体的问题,以便我可以产生更好的解决方案。