Ruby on 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个模型连接起来,以便更容易访问。除了捷径之外,我还有什么遗漏的吗 逻辑,好吧,这听起来可能有点弱,但是说“我有一个供应商,他在我身边有一个帐户,

Rails有一个
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