我有一个应用程序,其中有一个名为land_plots
的表,每个land_plot
都应该有一个water_source
,它要么是一条河,要么是一口井。
河流有固定的盐度,而威尔斯一般没有。因此,我需要将井水源的盐度存储为示例,但河流只有一个值(可能在类本身中)。因此,我的方法是在land_plot
中创建一个多态关系,它可以连接到PORO、river
或另一个类well
(这是一个常规的Rails类)。
如何在Rails中构建与PORO的多态关系?
我有一个应用程序,其中有一个名为land_plots
的表,每个land_plot
都应该有一个water_source
,它要么是一条河,要么是一口井。
河流有固定的盐度,而威尔斯一般没有。因此,我需要将井水源的盐度存储为示例,但河流只有一个值(可能在类本身中)。因此,我的方法是在land_plot
中创建一个多态关系,它可以连接到PORO、river
或另一个类well
(这是一个常规的Rails类)。
如何在Rails中构建与PORO的多态关系?
2条答案
按热度按时间ffvjumwh1#
您是否有
water_sources
表(因为您希望存储有关特定水源的信息)?如果有,您可能希望研究该表的单表继承,这样您就可以拥有River
和Well
类,并在LandPlot
中使用普通的has_one
Rails关联。这两个类都不是PORO,但我不确定为什么会有这个问题。如果特定的水源无关紧要,您的
land_plots
表可以有一个water_source_type
列来存储字符串“river”或“well”,LandPlot类可以如下所示:在不了解你们更多要求的情况下,我只能提供这么多了。
8xiog9wr2#
如何在Rails中构建与PORO的多态关系?
**你不需要。**关联是一种围绕数据库表之间关系的面向对象的抽象。它们的存在是为了使从其他相关表中获取数据更容易。当你谈论一个只存在于Rails进程内存中的PORO时,整个概念是无关紧要的。
对PORO的引用可以通过使用示例变量存储在内存中。
但问题仍然是你实际上打算如何将数据从一个请求持久化到另一个请求。你可以使用像序列化PORO这样的新方法,但这实际上要糟糕得多,因为你将无法以一种理智的方式查询它的数据,而且这会增加很多复杂性。
多态关联本身就是对RDBMS中外键关系指向一个固定表这一事实的恶意攻击。它是通过使用一个带有类名的字符串类型列和一个包含其他表ID的BIGINT列来完成的。Rails然后使用该类提供的
model_name
来确定要连接哪个表。同样,如果您没有一个 other 表来指向它,这是一个不相关的概念-您不能连接一个甚至不存在于数据库中的PORO。