Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ActiveRecord中拥有异构集合?_Ruby On Rails_Ruby_Activerecord_Sti - Fatal编程技术网

Ruby on rails 如何在ActiveRecord中拥有异构集合?

Ruby on rails 如何在ActiveRecord中拥有异构集合?,ruby-on-rails,ruby,activerecord,sti,Ruby On Rails,Ruby,Activerecord,Sti,我对Rails有些陌生,来自Java,所以我可能在这里完全不熟悉,但我想做以下几点: 我有一个类a,它有一个其他对象的集合。该集合可以包含B、C和/或D对象。重要的是 B实际上是一系列类的父类(可能是 通过STI和JSONB数据存储实现(用于差异) C和D由一个或多个B组成,但仍将响应 与B相同的方法(即B、C和D都有duck类型的方法) 从A的一个实例中,我希望能够调用,比如说,@A.collection[2]。dou this并调用适当的dou this 考虑到这一点,我在网上查看示例,最接

我对Rails有些陌生,来自Java,所以我可能在这里完全不熟悉,但我想做以下几点:

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

  • B实际上是一系列类的父类(可能是 通过STI和JSONB数据存储实现(用于差异)

  • C和D由一个或多个B组成,但仍将响应 与B相同的方法(即B、C和D都有duck类型的方法)

  • 从A的一个实例中,我希望能够调用,比如说,@A.collection[2]。dou this并调用适当的dou this


    考虑到这一点,我在网上查看示例,最接近我所看到的是经典示例:带有帖子、视频等的多态示例,共享单个评论类。然而,这似乎与我想要的正好相反(多对一而不是一对多)。我是在向后看还是怎么看?或者我可以做一些外键的事情,欺骗ActiveRecord进行多任务继承吗?我已经浏览了有关MTI的Enterprise Rails一章,但鉴于这种情况,我希望找到一种更简单/更合适的方法。

    在这种情况下,您可以利用MTI并使用source来执行方法#为此,您确实希望查看source和source类型方法。我严格地说是通过活动记录

    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"
    

    现在,您可以通过相关的代码器加载内容,并通过该模型调用#do#u this方法。在ruby中,若您在每个类中实现了相同的方法,那个么应该按照duck类型执行,这表明一个方法是否可以通过将要运行的对象进行响应。您还可以使用eval和send方法来减轻编程站点上的负载。希望这有帮助,但如果没有,请给我具体的问题,这样我可以产生更好的解决方案

    在这种情况下,您可以利用MTI并使用源代码执行方法#为此,您确实希望查看源代码和源类型方法。我严格地说是通过活动记录

    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"
    

    现在,您可以通过相关的代码器加载内容,并通过该模型调用#do#u this方法。在ruby中,若您在每个类中实现了相同的方法,那个么应该按照duck类型执行,这表明一个方法是否可以通过将要运行的对象进行响应。您还可以使用eval和send方法来减轻编程站点上的负载。希望这有帮助,但如果没有,请给我具体的问题,这样我可以产生更好的解决方案

    我认为你描述了STI和多态性关联。如果这些工艺不适合你的问题,我就不明白了。而且对我来说,这听起来更像是一场灾难。你解释了你想建立什么。你能不能解释一下你为什么需要这样做,以及你试图以一种不那么抽象的方式实现什么?@spickermann我提供了背景信息来说明我想做什么。问题的核心是,“在Rails中,不使用STI创建异构集合的正确方法是什么?”我认为您描述了STI和多态关联。如果这些工艺不适合你的问题,我就不明白了。而且对我来说,这听起来更像是一场灾难。你解释了你想建立什么。你能不能解释一下你为什么需要这样做,以及你试图以一种不那么抽象的方式实现什么?@spickermann我提供了背景信息来说明我想做什么。问题的核心是,“在Rails中,不使用STI创建异构集合的正确方法是什么?”在您的示例中,
    companyable
    看起来像什么?companyable在表companyable\u id和companyable\u type中有两个字段,其中id表示上述示例中类型的记录编号,可以是项目、催化剂或战略计划。在您的示例中,
    companyable
    看起来像什么?companyable在表companyable\u id和companyable\u type中有两个字段,其中id表示上述示例中类型的记录编号,可以是项目、催化剂或战略计划。