问题标签 [polymorphic-associations]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
15331 浏览

ruby-on-rails - Rails:多对多多态关系

请参阅评论以获取更新。

我一直在努力得到一个清晰而直接的答案,我希望这次我能得到它!:D 我肯定还有很多东西要学习 Rails,但是我确实理解我面临的问题,并且非常感谢额外的帮助。

  • 我有一个名为“任务”的模型。
  • 我有一个名为“目标”的抽象模型。
  • 我想将 Target 子类的多个实例与 Task 关联起来。
  • 我没有使用单表继承。
  • 我想查询多态关系以返回 Target 子类的混合结果集。
  • 我想查询 Target 子类的各个实例以获取与它们有关系的任务。

所以,我认为任务和目标子类之间的多态多对多关系是有序的。更详细地说,我将能够在控制台中(当然还有其他地方)做这样的事情:

但!假设存在模型“Store”、“Software”、“Office”、“Vehicle”,它们都是“Target”的子类,那么在另一个方向上也可以遍历关系:

多态关系隐含的数据库表似乎能够进行这种遍历,但我看到一些反复出现的主题,试图找到一个对我来说违背多态关系精神的答案:

  • 仍然使用我的示例,人们似乎想要在 Task 中定义 Store、Software、Office、Vehicle,我们可以立即看出这不是多态关系,因为它只返回一种类型的 model
  • 与最后一点类似,人们仍然希望以一种形式或形式在 Task 中定义 Store、Software、Office 和 Vehicle。这里重要的一点是关系对子类化是盲目的。我的多态最初只会作为目标进行交互,而不是作为它们各自的子类类型。在 Task 中定义每个子类再次开始侵蚀多态关系的目的。
  • 我看到连接表的模型可能是有序的,这对我来说似乎有些正确,只是它增加了一些我认为 Rails 愿意放弃的复杂性。我恳求在这方面没有经验。

这似乎是 Rails 功能或集体社区知识中的一个小漏洞。所以希望stackoverflow可以记录我对答案的搜索!

感谢所有帮助的人!

0 投票
2 回答
6261 浏览

ruby-on-rails - 同一模型上具有多个关联的多态关联

我对我所拥有的多态关联感到有些困惑。我需要一个 Article 模型来拥有一个标题图像和许多图像,但我想要一个 Image 模型。更令人困惑的是,Image 模型是多态的(允许其他资源拥有许多图像)。

我在我的文章模型中使用了这个关联:

这可能吗?谢谢。

0 投票
3 回答
272 浏览

database-design - 我可以用多个具体的超级表来完成这个吗?

我有两个可以评论和评分的表格,“内容”和“个人资料”。我已经研究过使用多态关联并决定反对它。如果我要使用多态关联,表“评分”和“评论”都将具有此功能。

这可以通过具体的超表实现来实现吗?如果是这样,我该怎么做?

0 投票
1 回答
546 浏览

sql - 多态 Rails 关联(倒退?)

我的 Rails 应用程序中有一个多对一多态 Rails 关联,用于“案例”模型。有很多东西都有案例,所以我通过执行“thing_that_has_a_case.case”来访问每个事物的案例。

但是,我正在尝试另一种方式,但我不确定如何。我可以访问 case 对象,但我想访问正在装箱的东西。rails有办法做到这一点吗?我可以用一个丑陋的开关来做到这一点,它为每种类型的对象执行不同的 sql 查找,但我希望 rails 有更好的方法。谢谢!

0 投票
1 回答
321 浏览

ruby-on-rails - 这个 Ruby on Rails 通用模型模式有名称吗?多联?

这种常见的模型模式似乎没有名字。

它用于许多插件,例如acts_as_taggable[_whatever],它基本上允许
将某个模型(如 Tag)与任何其他模型链接,而无需
在 Tag 模型中放置更多的 belongs_to 语句。

它通过将模型(标记)链接到
表示连接表的多态连接模型(标记)来工作。这将创建一个独立的模型,任何
其他模型都可以在其中关联。
(它们通过has_many:as 和 has_many :through 关联)

我经常想将这种类型的模型关系称为一件事。
也许称它为“多链接模型”或“多链接模型”?
例如,“使其成为一个多链接模型,并在您编写代码时将其与任何其他模型相关联。”

还有其他建议吗?

这是模型的内部工作原理acts_as_taggable

0 投票
2 回答
715 浏览

ruby-on-rails - 模拟用户与不同实体的“友谊”的最佳方式?

我有以下实体:

  • 用户
  • 公司
  • 组织

用户需要能够将用户、公司、组织和未来的聚会对象添加到他们的朋友列表中。

我最初的想法涉及使用与朋友具有多态关系的 Friendship 对象,如下所示:

简化的友谊模式:

  • 用户身份
  • 友好的_id
  • 友好型

我的问题是 Ruby on Rails ActiveRecord 不支持 has_many 通过连接表上的多态关系等的关系。

最后,我希望有一个单一的连接表能够遍历以获得所有类型、某些类型等的朋友列表,如下所示:

我考虑过让 User、Business 和 Organization 从通用 Party 类继承,并使关联指向基 Party 类,但在 ORM 的上下文中会导致一堆垃圾字段,而且看起来很脏。

我想知道的是其他人将如何处理这样的情况,您希望通过使用 ActiveRecord 的公共连接表创建与相似对象的一对多关系,同时避免此错误::)

非常感谢任何建议。

谢谢!

0 投票
1 回答
850 浏览

optimization - 如何优化这个涉及两个左连接的 MySQL 查询?

我无法弄清楚为什么我的查询变慢了。它归结为四个表:团队、球员、设备和元数据。玩家和设备中的记录对团队有 FK,使团队成为玩家和设备的父级。并且所有这三个表的行在元数据中都有一条记录,其中存储了创建日期、创建者用户 ID 等内容。

我想一次检索的是属于特定团队的任何球员和设备记录,按创建日期顺序排列。我从元数据表开始,通过 metadata_id FK 离开加入球员和设备表,但是当我尝试过滤 SELECT 以仅检索某个团队的记录时,当有很多行时,查询会大大减慢。

这是查询:

您需要添加很多行才能真正看到减速,每个表大约 10,000 行。我不明白的是,如果我只在一个表上的 where 子句中进行过滤,为什么它真的很快,例如:“... AND player.team_id = 1”但是当我添加另一个以使其成为“.. . AND (player.team_id = 1 OR equipment.team_id = 1)" 这需要很长很长的时间。

这是表和数据类型。请注意,似乎有很大帮助的一件事,但不是全部,是元数据_id 和团队_id 的播放器和设备上的组合键。

请注意,我意识到我可以通过对给定团队 id 的玩家和设备执行两个 SELECTS 的 UNION 来轻松加快这一速度,但是我使用的 ORM 本身并不支持 UNION,所以我更愿意尝试看看如果我可以优化此查询。我也只是很好奇。

0 投票
4 回答
2268 浏览

ruby-on-rails - Rails 多态关系和link_to

这是我的架构

我想使用 link_to 链接到菜单视图中的多态类,例如

这行得通,但是当我只想生成一个链接时,它会从数据库中检索菜单对象。你可以想象,如果我的菜单很大,这真的会让我的应用程序陷入困境。

当我将 menuable 字段定义为多态时,Rails 创建了 menuable_type 和 menuable_id。我可以用什么来生成多态页面的链接,而不是用巨大的 switch 语句编写一个辅助函数(例如,如果我有大量可菜单的“子类”?)

0 投票
2 回答
1656 浏览

mysql - MySQL 多选

我有一个索引表,其中包含一个 content_id 和类型列。(例如 content_id=1,type=audio。content_id=1,type=video)是否可以根据 content_id 从正确的表(表:contentvideo、contentaudio)中获取正确的数据?

0 投票
1 回答
101 浏览

ruby - 使用关联创建 Ruby ActiveRecord 对象

我有具有地址的人员和团队(多态关联)

我需要在代码中分别创建人员和地址:

person = Person.new

address = Address.new

然后使用类似的东西将它们链接在一起:


person.addressable.push(address)

最后,做:

person.save!

然而,当你没想到它时,这会给出一个你有一个 nil 对象!评估 nil.has_key 时发生错误?

有人可以让我知道我需要做什么吗?谷歌上几乎没有代码可以演示这些,我能找到的只是 API 参考