Rails has_many: through: ассоциация с таблицей, которая использует STI

Я не могу понять, как заставить это работать; Я посмотрел на другие вопросы, в том числе этот и этот, но безрезультатно.

Вот мои модели:

class User < ActiveRecord::Base
  has_many :connections
  has_many :data_sources, through: :connections
end

class Connection < ActiveRecord::Base
  belongs_to :user
  belongs_to :data_source
end

class DataSource < ActiveRecord::Base
  has_many :connections
  has_many :users, through: :connections
end

class AdNetwork < DataSource
end

class Marketplace < DataSource
end

AdNetwork, Marketplace и DataSource используют одну и ту же таблицу через STI.

Я хочу создать ассоциации на User называется marketplaces а также ad_networks которые возвращают все data_sources где type является MarketPlace или же AdNetwork соответственно. Как я могу это сделать?


То, что я пробовал, не сработало:

class User
  has_many :marketplaces, through: :data_sources # Throws an error
  has_many :marketplaces, through: :connections # Throws an error
  has_many :marketplaces, through: :connections, source: :data_source # Returns ALL data sources, not just Marketplaces
  has_many :marketplaces, { through: :connections, source: :data_source }, -> { where(type: "Marketplace" } # Again this returns ALL data sources. Wtf???
end

Я также попытался добавить столбец data_source_type в Connection и добавив следующие строки

Класс Connection принадлежит: источник_ данных, полиморфный: true
конец

Класс DataSource has_many: соединения, как:: конец источника данных

класс User has_many: marketplaces, через:: connection, source::data_source, source_type: "Marketplace" конец

... но сейчас #marketplaces возвращает пустое отношение. (Это выглядит как data_source_type ВСЕГДА устанавливается на DataSourceдаже когда я добавляю Marketplace или AdNetwork.)

Что я делаю неправильно?

1 ответ

Я работаю над чем-то похожим. Я думаю, что ответ лежит в вашей модели атрибутов.

Я решил это, когда понял, что в таблице соединений не указан идентификатор ссылки (аналогично таблице соединений).

Смотрите ссылку: http://guides.rubyonrails.org/association_basics.html

Вы когда-нибудь находили решение?

Другие вопросы по тегам