Rails - 有很多关于模型和多个参考
Rails - Has many on model with multiple references
我有一个模型 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
关系。
您不能定义外键是两列之一的 has_many 关联。它只是不受 ActiveRecord 支持,因为该功能会增加大量复杂性。
两个关联使用相同的名称也只是覆盖以前的关联。如果你想在这里有一个单一的关联,你需要添加一个连接 table.
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
的方法,但是当涉及到预加载之类的东西时,您将无法以与关联相同的方式使用它。
我有一个模型 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
关系。
您不能定义外键是两列之一的 has_many 关联。它只是不受 ActiveRecord 支持,因为该功能会增加大量复杂性。
两个关联使用相同的名称也只是覆盖以前的关联。如果你想在这里有一个单一的关联,你需要添加一个连接 table.
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
的方法,但是当涉及到预加载之类的东西时,您将无法以与关联相同的方式使用它。