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
Вы когда-нибудь находили решение?