Ruby on rails Rails有一个:通过关联
Rails有一个Ruby on rails Rails有一个:通过关联,ruby-on-rails,associations,rails-activerecord,rails-models,Ruby On Rails,Associations,Rails Activerecord,Rails Models,Rails有一个has_one:through关联,它通过第二个模型帮助建立与第三个模型的一对一关联。这样做的真正用途是什么?除了创建一个快捷关联,否则这将是额外的一步 以Rails为例: 否则将达到以下目的: supplier.account.history 如果只是为了更简单的访问,那么技术上可能会有一对一的关联,将一个模型与经过n-1个模型的第n个模型连接起来,以便更容易访问。除了捷径之外,我还有什么遗漏的吗 逻辑,好吧,这听起来可能有点弱,但是说“我有一个供应商,他在我身边有一个帐户,
has_one:through
关联,它通过第二个模型帮助建立与第三个模型的一对一关联。这样做的真正用途是什么?除了创建一个快捷关联,否则这将是额外的一步
以Rails为例:
否则将达到以下目的:
supplier.account.history
如果只是为了更简单的访问,那么技术上可能会有一对一的关联,将一个模型与经过n-1个模型的第n个模型连接起来,以便更容易访问。除了捷径之外,我还有什么遗漏的吗
的主要原因:通过,原因很简单,这会发出联接语句,而不是调用供应商,然后调用account,然后调用account\u历史记录。注意到数据库调用的数量了吗
- 使用
:通过,1次调用获取供应商,1次调用获取帐户历史记录(rails自动使用:join
通过帐户检索)
- 使用正常关联,1次调用获取供应商,1次调用获取帐户,1次调用获取帐户历史记录
-
<> >强>逆关联< /强>:考虑经典情况用户成员组。如果一个用户可以是多个组中的成员,那么一个组有多个成员或用户,而一个用户有多个组。但是,如果用户只能是一个组中的成员,则该组仍然有许多成员:
类用户有一个组:通过=>:membership
但是类组有许多:成员:通过=>成员身份
。中间模型成员资格
有助于跟踪反向关系
有一个:通过
关系可以很容易地扩展并扩展到一个有多个:通过
关系- 我很惊讶没有人接触到关联对象
有多个
(或有一个
):通过
关系可以方便地使用,即当两个事物相互关联时,该关系本身具有属性(即建立关联或过期的日期)
这是
has\u和\u属于\u many
ActiveRecord帮助程序的一个很好的替代方案。这背后的原因是,您很可能需要更改关联的性质或添加到关联中,并且当您进入一个项目几个月时,如果最初将关系设置为一个has\u和\u属于\u many
(第二个链接将详细介绍)。如果最初使用has\u many:through
关系建立连接模型,那么在项目开始几个月后,可以很容易地重命名连接模型或向其添加属性,从而使开发人员更容易响应不断变化的需求。计划改变。我认为这个逻辑论点很有道理。听起来更自然地说,给我这个供应商的帐户历史记录,而不是供应商的帐户历史记录。考虑到Ruby/Rails的流畅语句而非代码的理念,这一点非常微妙,但更容易记住。我知道我们可以看到实际发出的DB查询,但Rails是否指定了这些方法调用将如何转换为SQL?这也避免了违反Demeter定律。@TomCrayford,我真的不知道它是如何做到的。这不是使关系不那么直接吗?@JasperKennis物理关系不那么直接,但假设不直接链接表的其他原因(例如,从一个帐户到另一个帐户取消供应商id的规范化需要回调和少量的存储空间),这使得您不必每次通过供应商访问帐户历史时都编写一系列方法。如果中间的表在以后某个时候发生更改,则不必在整个应用程序中重写方法调用。您只需更改关联。我们也不要忘记避免这样一种情况,即您可能需要从类中调用另一个类方法来执行非常简单的操作,并且不希望为可能非常简单的数据请求创建接口或服务对象<代码>有一个:对于在三级关系数据上执行操作来说,through比在调用类中注入或实例化三级类要干净得多。非常感谢。我已经挣扎了几天,试图让它工作,却不知道我需要:through指令。现在好多了。
supplier.account_history
supplier.account.history