I have a nested preload with a has_many relation and I would love to filter these references by a join I did on the top level, Here is my naive thinking:
query =
from vm in VariantMarket,as: :vm,
left_join: m in assoc(vm, :market), as: :m,
where: vm.id in ^ids,
preload: [
variant: [product: [market_settings: ^pms_query.()]]
]
and for pms_query
I was hoping I could us the dynamic
helper like this:
pms_query = fn ->
market_filter = dynamic([pm: pm, m: m], m.id == pm.market_id)
from pm in Pdex.Catalog.ProductMarket,
as: :pm,
where: ^market_filter
end
But I get ann error saying
unknown bind name `:m` in query
As far as I understand this, it’s not possible to reference any top-level joins within a preload. I also tried subqueries with parent_as
in the preload part but that was also unsuccessful.
I know I could solve this particular case with a few more joins on the product
assoc and then the market_setting
assoc, which I could then reference directly in the preload.
But this is just an example to test this kind of filtering. I have a more complex example where multiple joins would be a nightmare.
I get the impression it’s, in general, not possible to simply use a top-level reference as a filter in a preload. Maybe because of the order of interpolation.
But maybe I am just not understanding the dynamic helper at all, and someone could give me a hand, or could at least confirm my assumption.
Thanks in advance
Bjorn