gpt4 book ai didi

ruby-on-rails - RoR : has_one "or the other"?(或者,没有继承的多态性。)

转载 作者:行者123 更新时间:2023-12-04 05:40:28 25 4
gpt4 key购买 nike

大家好,我的项目有一些有趣的要求。我需要一个 has_one关系,它要么是一个类,要么是另一个类,但没有继承。如果这是唯一的方法,我可以摆脱继承,但是两个关联记录具有完全不同的数据并且根本不相关。

我需要弄清楚的是以下内容。

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
# related in either data or implementation.

class Foo < ActiveRecord::Base
# Attributes: id, name, value
has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
# Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
# Attributes: name,...
end

class Baz < ActiveRecord::Base
# Attributes: name,...
end

在哪里 Foo有一个赋值,类型为 BarBaz ;它们只共享一个公共(public)列,所以也许我可以从中创建一个父对象。但是,如果我让它们继承自一个通用对象(当它们包含的数据确实是橙子和苹果时)我必须为记录制作一个表吗?如果记录是抽象记录,但 children 不是,我可以侥幸逃脱吗?

我想现在你可以看出我的困难了。我对 RoR 很陌生,但到目前为止我很喜欢它。我敢肯定有办法解决这个问题,但如果我无法弄清楚它是什么,我会被诅咒的。

最佳答案

您正在尝试对不符合关系数据库范式的东西进行建模。 SQL 中的所有引用都有一个来源和一个目标。

FWIW,多态关联也是一种反模式,因为它打破了这条规则。当文档说您必须放弃参照完整性约束才能使其工作时,这应该是一个线索,表明它是一个损坏的设计!

你需要 Foo 有两个 has_one关系 :一个给Bar,一个给Baz。然后实现一些类逻辑,以确保在任何 Foo 实例中只填充一个引用。也就是说,在对 Bar 和 Baz 的引用中,一个必须有值,另一个必须为零,但这是您的代码需要检查和执行的内容。

关于ruby-on-rails - RoR : has_one "or the other"?(或者,没有继承的多态性。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com