【问题标题】:Rails - Has many on model with multiple referencesRails - 有很多模型和多个参考
【发布时间】:2021-09-15 10:56:33
【问题描述】:

我有一个模型 CompanyIntro,它有两个对 Company 的引用:

class CompanyIntro < ApplicationRecord
  belongs_to :company_one, class_name: "Company", foreign_key: "company_one_id"
  belongs_to :company_two, class_name: "Company", foreign_key: "company_two_id"

  ...

我想做这样的事情:

class Company < ApplicationRecord
  has_many :company_intros, class_name: 'CompanyIntro', foreign_key: 'company_one_id'
  has_many :company_intros, class_name: 'CompanyIntro', foreign_key: 'company_two_id'

...

但这是无效的

在我的Company 模型中,如何为两个外键创建has_many?我正在使用 Rails 6,它不允许 has_many (afaik) 的自定义 sql。我也不想在 Company 模型上编写自定义 company_intros 方法,因为我正在使用另一个 gem 来查找我的 has_many 关系。

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-6


    【解决方案1】:

    您不能定义外键是两列之一的 has_many 关联。 ActiveRecord 不支持它,因为该功能会增加大量复杂性。

    对两个关联使用相同的名称也会覆盖之前的关联。如果你想在这里有一个单一的关联,你需要添加一个连接表。

    class Company < ApplicationRecord
      has_many :company_intro_participations
      has_many :company_intros, through: :company_intro_participations
    end
    
    # for lack of a better name
    class CompanyIntroParticipation < ApplicationRecord
      belongs_to :company
      belongs_to :company_intro
    end
    
    class CompanyIntro < ApplicationRecord
      has_many :company_intro_participations
      has_many :companies, through: :company_intro_participations
    end
    

    另一种方法是创建一个加入 company_one_id = companies.id OR company_two_id = companies.id 的方法,但是当涉及像急切加载这样的东西时,您将无法以与关联相同的方式使用它。

    【讨论】:

    • 谢谢。您的回答是有道理的,感谢您在此处提供的选项。在 Rails 5 之前,您可以为 has_many 编写自己的 SQL,但这不再受支持。连接表可能有意义,但我不想让它过于复杂。谢谢!
    • 您仍然可以将范围添加到关联has_many :foos, -&gt;{ where(bar: 'baz') },但您不能更改联接子句。当您考虑到 .joins.includes.eager_load 创建完全不同的查询时,这是有道理的。
    • 如果你想找到 ppl 如何解决它的例子,每次有人试图制作一个用户可以互相喜欢的 facebook 克隆时都会弹出相同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2017-04-29
    • 2013-12-16
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多