Greetings!
I am working on ROM adapter for an old SOAP API and I am current stuck on a problem with ManyToMany
associations. As a bit of background, here is what my relations look like:
ROM::Configuration.new(:adwords, client: client) do |config|
config.relation(:campaigns) do
schema(infer: true) do
attribute :id, Gladwords::Types::ID
primary_key :id
associations do
has_many :ad_groups, combine_key: :campaign_id
has_many :ad_group_ads, through: :ad_groups
end
end
end
config.relation(:ad_groups) do
schema(infer: true) do
attribute :id, Gladwords::Types::ID
primary_key :id
associations do
belongs_to :campaign, combine_key: :id
has_many :ad_group_ads, combine_key: :ad_group_id
end
end
end
config.relation(:ad_group_ads) do
schema(infer: true) do
associations do
belongs_to :ad_group
end
end
end
end
In order to make this configuration work, I will have to resolve the ad_groups
relationship before I resolve the ad_group_ads
relationship. This way, I can get all the ad_group_ads.where(ad_group_id: [1,2,3]
). However, within my ManyToMany
association class, I only receive .call
with a target of ROM::Relation::AdGroupAds
and a source of ROM::Relation::Campaigns
.
In my preload
method, I could resolve the data fine if I could ensure that ad_groups
were combined on campaigns
. i.e. campaigns.combine(:ad_groups)
. This way, I would have a list of ad_groups
that I could then filter ad_group_ads
by.
Is the a straightforward way of modifying the source
relation within a ManyToMany
association so I could make this work?
Hopefully that all makes sense and doesn’t scare everyone away! If what I said sounds like a mad-man rambling, please ask me to clarify.
Thanks in advance,
Ian