Home > Mobile >  Rails - Has many on model with multiple references
Rails - Has many on model with multiple references

Time:09-16

I have a model CompanyIntro which has two references to a 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"

  ...

I would like to do something like:

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'

...

But this is not valid

In my Company model, how to I create a has_many for both foreign keys? I am using Rails 6 which dos not allow custom sql for has_many (afaik). I also do not want to write a custom company_intros method on the Company model as I'm using another gem which looks for my has_many relationships.

CodePudding user response:

You can't define has_many assocations where the foreign key is one of two columns. Its just not supported by ActiveRecord as the feature would add tons of complexity.

Using the same name for two assocations also just overwrites the previous assocation. If you want to have a single assocation here you need to add a join 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

The alternative is creating a method which joins on company_one_id = companies.id OR company_two_id = companies.id but you will not be able to use that in the same way as an association when it comes to stuff like eager loading.

  • Related