刚接触Rails,想知道是否可以用ActiveRecords来建模这种关系:
我有以下模型(简化):
User:
- name
- email
个字符
然后我有一个模型attendee
,它与这两个表都相关,但有一个类型列:
| id | join_type | join_id |
|----|-----------|---------|
| 1 | user | 1 |
| 2 | client | 1 |
型
有没有一种方法可以使用has_one
关系对活动记录进行建模?
比如说:
class Attendee < ApplicationRecord
# OBVIOUSLY DOESNT WORK
has_one :user, ->() { where(join_type: 'user') }, :class_name => 'User'
has_one :client, ->() { where(join_type: 'client') }, :class_name => 'Client'
end
型
所以它会生成正确的左连接,所以呢?
谢谢
4条答案
按热度按时间uemypmqf1#
使用此结构创建与会者表
个字符
然后,您可以像这样从Attendee示例访问用户/客户端
型
如果要从用户/客户访问与会者,可以按如下方式定义与会者
型
xu3bshqb2#
首先,您将成为
has_one
和belongs_to
这两个可怕命名所造成的典型混淆的受害者。belongs_to
意味着 this models表有一列引用另一个表(或同一个表)。这是您实际需要的。has_one
意味着 * 另一边 * 有一个引用这个表的列。有点像has_many
,但它生成不同的方法,并将LIMIT 1
附加到查询中。如果它被命名为referenced_by
,它将为我们节省很多greif。我认为您可能正在寻找的是通过连接表与多态关联的间接关联。
字符串
其工作方式是attendences表同时具有attendee_id和attendee_type列。后者存储关联项的类名。
通过将
polymorphic
选项传递给add_reference
,可以在迁移中同时创建两个列:型
如果这实际上是一个好的设计是有争议的,因为你不能使用外键约束来维护数据库级别的引用完整性。
同样的目标可以通过简单地创建两个连接表来实现,即使ActiveRecord不能真正将其视为来自
meetings
端的单个关联。j2cgzkjk3#
我的方法是定义一个
UserAttendee
模型和一个ClientAttendee
模型,这两个模型都继承自attendee(=单表继承,STI)。因此,attendee将需要一个type
列,该列将在创建子类时自动填充。字符串
您仍然可以随意使用
Attendee
类。您在attendees表中显示join_id
字段,这对于has_one关系不是必需的,只有belongs_to关系。User
和Client
将具有user_attendee_id和client_attendee_id列。型
exdqitrt4#
欢迎来到Rails。我想提出一个更简单的解决方案:
字符串
这样你就可以使用你最喜欢的数据库系统的所有数据完整性特性,并简化你的rails代码如下:
型
这样的代码更容易阅读和维护。你会很高兴没有出席记录指向无处。