我对Rails有点陌生,并且来自Java,所以我可能在这里完全偏离了基础,但这是我想做的:
我有一个类a,它有其他对象的集合。该集合可以包含B、C和/或D对象。重要的是,
-
B实际上是一个类族的父类(可能)通过STI和JSONB数据存储实现的差异)
-
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方法来减轻编程站点上的负载。希望这能有所帮助,但如果没有,请给我具体的问题,这样我就能产生更好的解决方案。