ruby-on-rails 导轨-与PORO的关系

7ajki6be  于 2023-03-13  发布在  Ruby
关注(0)|答案(2)|浏览(200)

我有一个应用程序,其中有一个名为land_plots的表,每个land_plot都应该有一个water_source,它要么是一条河,要么是一口井。
河流有固定的盐度,而威尔斯一般没有。因此,我需要将井水源的盐度存储为示例,但河流只有一个值(可能在类本身中)。因此,我的方法是在land_plot中创建一个多态关系,它可以连接到PORO、river或另一个类well(这是一个常规的Rails类)。
如何在Rails中构建与PORO的多态关系?

ffvjumwh

ffvjumwh1#

您是否有water_sources表(因为您希望存储有关特定水源的信息)?如果有,您可能希望研究该表的单表继承,这样您就可以拥有RiverWell类,并在LandPlot中使用普通的has_one Rails关联。这两个类都不是PORO,但我不确定为什么会有这个问题。
如果特定的水源无关紧要,您的land_plots表可以有一个water_source_type列来存储字符串“river”或“well”,LandPlot类可以如下所示:

class LandPlot < ApplicationRecord
  validates :water_source_type, inclusion: { in: ['river', 'well'] }

  def water_source
    water_source_type == 'river' ? River.new : Well.new
  end
end

在不了解你们更多要求的情况下,我只能提供这么多了。

8xiog9wr

8xiog9wr2#

如何在Rails中构建与PORO的多态关系?

**你不需要。**关联是一种围绕数据库表之间关系的面向对象的抽象。它们的存在是为了使从其他相关表中获取数据更容易。当你谈论一个只存在于Rails进程内存中的PORO时,整个概念是无关紧要的。

对PORO的引用可以通过使用示例变量存储在内存中。

class Foo
  attr_accessor :bar
  def initialize(bar:)
    @bar = bar
  end
end

Foo.new(bar: Bar.new)

但问题仍然是你实际上打算如何将数据从一个请求持久化到另一个请求。你可以使用像序列化PORO这样的新方法,但这实际上要糟糕得多,因为你将无法以一种理智的方式查询它的数据,而且这会增加很多复杂性。
多态关联本身就是对RDBMS中外键关系指向一个固定表这一事实的恶意攻击。它是通过使用一个带有类名的字符串类型列和一个包含其他表ID的BIGINT列来完成的。Rails然后使用该类提供的model_name来确定要连接哪个表。
同样,如果您没有一个 other 表来指向它,这是一个不相关的概念-您不能连接一个甚至不存在于数据库中的PORO。

相关问题