我怎么可能有一个异构集合在ActiveRecord



我对Rails有点陌生,并且来自Java,所以我可能在这里完全偏离了基础,但这是我想做的:

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

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

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

从A的实例中,我希望能够调用@a.collection[2]。并调用相应的# Do_this .

考虑到这一点,我在网上看例子,最接近我能看到的是经典的:多态例子与帖子,视频等共享一个评论类。然而,这似乎与我想要的相反(多对一而不是一对多)。是我看反了还是怎么的?或者我可以做一些外键的东西和欺骗ActiveRecord做多表继承?我已经浏览了关于MTI的Enterprise Rails章节,但我希望在这种情况下有一种更简单/更合适的方法。

在这种情况下,您可以利用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方法来减轻编程站点上的负载。希望这能有所帮助,但如果没有,请给我具体的问题,这样我就能产生更好的解决方案。

最新更新