回报率:HAS_ONE“或其他”? (或者说,没有多态性的继承。)
-
22-08-2019 - |
题
嘿,我有一个有趣的要求,我的项目的东西。我需要一个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
具有一个分配,键入Bar
或Baz
的;他们只有一个共同的列,所以也许我可以从父对象。但是,如果我让他们从一个共同的对象继承(当它们包含真正的数据,桔子和苹果),我必须做一个表备案?我也许可以逃脱它如果记录是一个抽象的记录,但这些孩子是不是?
我想现在你可以看到我的难处。我是相当新的回报率,但到目前为止喜欢它。我敢肯定有解决的办法,但如果我无法弄清楚它是什么,我会该死的。
解决方案
您正在尝试一些不符合关系型数据库规范模型。在SQL的所有引用一个起点和一个目标。
FWIW,多态关联也是一个反模式,因为它打破该规则。这应该是一个线索,这是一个破碎的设计时的文件的表示,你必须放弃一个参照完整性约束,使其工作!
您需要富有两个has_one
关系:一个酒吧和一个巴兹。然后执行一些类的逻辑,试图确保只有一个引用Foo中的任何实例填充。也就是说,引用到酒吧和巴兹,一个人必须有一个值,而另一个必须是零,但是这是你的代码来检查和强制执行。
其他提示
也许一个做到这一点的方法,就是在富来创造有关联,以及对酒吧和巴兹。然后创建一个名为分配和分配方法=它可以访问栏和巴兹的唯一方式。您可以检查哪些两个has_ones的是不是GET方法零并返回一个。在分配方法,你可以检查什么是在传递的变量的类型和设置正确的有一关系到该对象并设置其他为零。这应该覆盖所有客户群而不太复杂了。
不隶属于 StackOverflow