Ruby on Rails:如何通过复制主键创建“has_one”关系?

Ruby on Rails: How do you create a `has_one` relationship with duplicating primary keys?

提问人:Wallace 提问时间:11/9/2023 更新时间:11/17/2023 访问量:44

问:

我有 2 张表:

Dogs
- id (primary key)

Cats
- id (primary key)

我想介绍第三张表,假设狗和猫都有:Collars

Collars:
- id (primary key)
- size

通常,如果只是 Dog -> Collar 模型关联,我可以做一个关系,默认的主键关系将解析。has_oneid

class Dog < ActiveRecord:Base
  has_one :collar
end

dog.collar.size = "XL"

但是,由于我有 2 个模型(狗和猫),我不确定这种关联如何解决,因为狗和猫表可能具有重复值。因此,与主键的关系分崩离析。idhas_one

class Dog < ActiveRecord:Base
  has_one :collar
end

class Cat < ActiveRecord:Base
  has_one :collar
end

# Dog Record - id: 1
# Cat Record - id: 1
# 2 separate tables allow for duplicate primary keys, so it would be impossible to resolve

dog.collar.size = "XL"
cat.collar.size = "S"

有没有办法使这种关系与活动记录关联一起工作?

Ruby-on-Rails 数据库 ActiveRecord 模型关联

评论

3赞 dbugger 11/9/2023
使用belongs_to:collar,项圈ID将始终是唯一的
5赞 engineersmnky 11/9/2023
虽然 @dbugger 的建议更合乎逻辑,但你也可以看看多态关联。这将存储对象 ID 和类型,以便它是 和collarable_id: 1, collarable_type: 'Dog'collarable_id: 1, collarable_type: 'Cat'
0赞 Wallace 11/9/2023
感谢您@dbugger回复。好吧,我认为这是有道理的。所以基本上,我会迁移 Dog 和 Cat 数据库以具有 ,以建立外键。然后做一个狗/猫:belongs_to项圈关系。这是对的吗?collar_id
2赞 dbugger 11/9/2023
这是正确的。
1赞 zaphodbln_ 11/9/2023
作为 dbuggers 解决方案的扩展:如果你需要反向(项圈 -> 狗/猫),你可以在你的项圈模型中添加一个方法动物:def animal return dog ||猫端

答:

0赞 Mittu Rajareddy 11/17/2023 #1

只是一个建议: 直接向狗和猫表添加大小,因为它比全新的桌子占用的空间更少,而且不那么复杂

这里可以帮到你belongs_to