Elixir 在Rails上创建数据库的Ecto/Phoenix上的多态性

Elixir 在Rails上创建数据库的Ecto/Phoenix上的多态性,elixir,phoenix-framework,ecto,ruby-on-rails,Elixir,Phoenix Framework,Ecto,Ruby On Rails,我很难在外胚层中实现多态性。我的主要问题是,我试图在Phoenix中处理多态关联,但数据来自我们的——let's be honnest——一个基于Rails的古老主应用程序使用和创建的数据库 其他模型都处理得很好,在Rails和Phoenix端读取或写入数据都没有问题 除了那些具有多态性的。我花了很多时间阅读了CTO的文档,我知道“rails方式”不是“正确的方式”,但我有点被困在这里,因为我的模型已经写在rails端(一些主题已经存储了数百万行) 因此,我在Rails中有一个抽象模型元素,它表

我很难在外胚层中实现多态性。我的主要问题是,我试图在Phoenix中处理多态关联,但数据来自我们的——let's be honnest——一个基于Rails的古老主应用程序使用和创建的数据库

其他模型都处理得很好,在Rails和Phoenix端读取或写入数据都没有问题

除了那些具有多态性的。我花了很多时间阅读了CTO的文档,我知道“rails方式”不是“正确的方式”,但我有点被困在这里,因为我的模型已经写在rails端(一些主题已经存储了数百万行)

因此,我在Rails中有一个抽象模型
元素
,它表示7个表(图像、视频、excel等)。我还有另外两个表,
doc\u images
items
。另外两个表属于
element
,因此具有
element\u id
element\u type
字段。同样,postgres中不存在
元素
表,只有
图像
视频

我曾尝试在Phoenix中设置我的
图像
视频
模型,但当我将此代码放入我的
项目
模式时:

  schema "items" do
    belongs_to(:video, Video, foreign_key: :element_id)
    belongs_to(:image, Image, foreign_key: :element_id)
    field(:element_type, :string)
    timestamps([{:created_at, :updated_at}])
  end
由于
(ArgumentError)字段/关联,我无法编译:架构上已设置元素\u id

我可以手工完成所有查询,但似乎无法正确编写模式

最后,我需要能够使这些查询正常工作(显然,除了文档/视频/图像部分外,所有查询都工作得非常好):

所以我的问题是:我还有什么选择?我可以向我的数据库中添加列甚至其他表(并从其中现有的表中迁移数据),但我不能从我的Rails应用程序中删除
元素
逻辑(主要是出于时间考虑,因为我团队中的其他人喜欢Rails的方式:p)


有没有人能够以EXTO-the-Rails的方式处理多态性,如果强烈反对的话?

与其尝试复制行为,我会选择最简单、最干净的解决方案

清除
项目中属于
的所有

schema "items" do
  field :element_id, :integer
  field :element_type, :string
  ...
end
将验证添加到
变更集
,检查具有该
元素id的相应
元素类型

Token
选择加入所有内容,保存文档/图像/etc

通过
element\u id
element\u type
中选择

这肯定会起作用,尽管它意味着每个select和upsert都有一个额外的查询,但我相信结果代码的清晰性很快就会得到回报


现在在Phoenix端执行正常查询,而不加入

,我们不需要插入任何数据,只需获取它们,这样就可以正常工作。但是如何合并这两个查询呢?我将不得不在这个巨大的变更集上执行许多操作,而拥有两个独立的变更集将增加应用程序其余部分的复杂性。我想我在你的解释中遗漏了什么。你说的“现在做你的正常查询”是什么意思?我应该在我的模式中使用前两个select,但不执行它们吗?我曾考虑过生成一个元组
{token_etc,item}
,并将其作为结果返回,但现在我想这可能会有所帮助。但我不确定,因为我从未在Rails中使用过多态性,也没有要测试的env:(无论如何,我无法从模式中删除关联,因为当我在Ecto中进行连接时,它会引发另一个参数错误:
**(ArgumentError)模式项没有关联:doc
。(尽管我更改了对->
左join:d的查询,在文档中,在:(d.id==i.element\u id和i.element\u type==“Doc”)
我不确定我是否理解为什么您需要这里的
连接。只需执行另一个查询并使用元组
{token\u etc,item}
。因为一旦我拥有了所有元素(感谢您,我成功地做到了这一点),如果这个元素是一个doc,我需要加入它的doc\u图像(它也有一个
元素\u类型
和一个
元素\u id
)。实现这一点需要很多不太可读的代码,但我想我没有其他方法。我会使用元组。谢谢:)
schema "items" do
  field :element_id, :integer
  field :element_type, :string
  ...
end