1

Допустим, у меня есть модель STI под названием Company. Он имеет три подкласса Firm, Client и PriorityClient.Как создать ассоциацию HABTM с подклассами модели STI?

class Company < ActiveRecord::Base 
    scope :firms_n_clients, -> { where(type: %w(Firm Client)) } 
end 
class Firm < Company; end 
class Client < Company; end 
class PriorityClient < Company; end 

У меня есть другая модель под названием Country. Теперь я хочу создать связь has_and_belongs_to_many между Country и firms_n_clients (только Firm и Client тип Company). Как это будет?

Заранее спасибо.

+0

посмотреть на тег: [Тег: class-table-inheritance] –

ответ

1

has_and_belongs_to_many ассоциации принимают области применения. Некоторые из них обсуждаются в Ruby on Rails documentation. Предполагая, необходимую таблицу соединения существует, ассоциация может быть установлена ​​следующим образом:

class Country < ActiveRecord::Base 
    has_and_belongs_to_many :companies, -> { where(type: %w(Firm Client)) } 
end 

class Firm < Company 
    has_and_belongs_to_many :countries 
end 

class Client < Company 
    has_and_belongs_to_many :countries 
end 

Пожалуйста, обратите внимание, дубликат кода в клиенте и фирмы. Это специально, потому что оно явно показывает, что клиенты и фирмы принадлежат и принадлежат к странам, а PriorityClients - нет.

Я не тестировал код ниже, но еще лучше, чтобы изменить ассоциацию HABTM бы объединить в firms_n_clients объем:

class Country < ActiveRecord::Base 
    has_and_belongs_to_many :companies, -> { merge(Company.firms_n_clients) } 
end 

Это имеет ряд преимуществ: Модель Страна Безразлично» t нужно знать о разных типах компаний, и изменение области действия также повлияет на ассоциацию.

+0

Благодарим вас за ответ. Теперь мой вопрос: как будет промежуточная таблица? это будет 'company_countries' с' company_id' и 'country_id' или будут две промежуточные таблицы, такие как' firm_countries' и 'clients_countries'? –

+0

@JunanChakma Думайте о соединении таблиц как соединение между таблицами, а не между моделями. Вот почему один стол с country_id и company_id - это путь. «Рельсы генерируют миграцию». Создайте необходимую страну для создания компании «ДжойнТайтКомпания». – SvenDittmer

+0

работает. Я принял ответ. Спасибо. –