在相同的两个对象之间具有两个不同的关联通常是不好的做法吗?

问题描述 投票:0回答:1

我意识到这有点自以为是,因此请根据每个代码约定专门询问这是否通常是一个好主意。

示例场景

[模拟图书馆中BooksClients之间的关系,假设每个图书馆规则,客户一次只能签出一本书。

对我来说,使事情变得复杂的原因是,客户仅在给定的时间段内签出一本书,然后退还。因此,这几乎就像是您不希望这种关系永远持续下去……在某个时候,委托人解除了那本书的责任(例如,如果一本书在委托人退还两年后被损坏,您不想致电过去的客户要求更换)。

尽管虽然是暂时的,但您仍希望记录这种关系,以便跟踪已签出书籍的客户的历史记录(因为这很可能导致您确实希望向以前的客户发送调查问卷,要求他们评论)。

换句话说,在我看来好像有2种关联...一种是暂时的,一种更持久。

虽然我可以从技术上编写代码来完成这项工作,但这似乎是一种糟糕的做法(例如……从直觉上讲,我觉得这个问题的答案是肯定的……这不是好习惯)。但是,我想确认一下,看看是否可以解决此问题(还有has_many :through,而穿透表具有某种... current_rental属性?)

什么样的2个关联会看起来像

关联#1,临时关联,您想知道将图书签出给哪个客户

Client has_one :book, foreign_key: "current_id"
Book belongs_to :current_client, class_name: "Client", foreign_key: "current_id"

这种关系非常有用,如果客户打电话说他们忘记了必须从个人书架上退还哪本书,则可以致电@client.book.title

协会#2,是长期的协会,您想知道一本书的历史(进一步假设客户的历史无关紧要,如果这样做的话,更清楚地是has_many :through或HABTM关系)] >

Client belongs_to :checkout_book, class_name: "Book", foreign_key: "book_id"
Book has_many :clients, foreign_key: "book_id"

此关系可以让您查看书籍的历史记录,已将其签出到@book.clients.size的客户人数,也可以通过电子邮件将其用于调查@book.clients.map(&:email)

然后,这种分离消除了混乱,比如说需要更换一本书,调用@book.clients.last可能会检索不正确的客户,因为提前进行了预订,因此结账不一定要按顺序进行。但是,您可以@book.current_client让合适的人跟进。

我意识到这有点自以为是,因此请根据每个代码约定专门询问这是否通常是一个好主意。示例场景对Books&...

ruby-on-rails activerecord associations
1个回答
0
投票
如果要存储大量数据的联接表,您希望存储额外关联的一个原因是优化读取查询。
© www.soinside.com 2019 - 2024. All rights reserved.