tanweerdev
Why I am getting same ids/resources returned when try to preload has_many relation
I have this query
#Ecto.Query<from i0 in HaiData.Infection,
left_join: e1 in assoc(i0, :encounter), left_join: f2 in assoc(i0, :facility),
left_join: r3 in assoc(i0, :revisions), order_by: [asc: i0.id], limit: ^10,
offset: ^0, select: map(i0, [:id, :encounter_id, :facility_id]),
preload: [
encounter: #Ecto.Query<from e0 in HaiData.Encounter, left_join: p1 in assoc(e0, :patient), limit: ^200, offset: ^0, select: map(e0, [:id, :patient_id]),
preload: [patient: #Ecto.Query<from p0 in HaiData.Patient, limit: ^200, offset: ^0, select: map(p0, [:id])>]>,
facility: #Ecto.Query<from f0 in HaiData.Facility, limit: ^200, offset: ^0, select: map(f0, [:id, :name])>,
revisions: #Ecto.Query<from i0 in HaiData.InfectionRevision, limit: ^200, offset: ^0, select: map(i0, [:revision_id])>
]
>
But in return I am getting same resource repeating ie same ids being returned, dont know the reason
[
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1},
%{encounter_id: 15, facility_id: 2, id: 1}
]
Really weird. Dont know if its a bug in ecto or my query. Please help me out debugging issue. Thanks
Marked As Solved
landric
I believe your original question…
same resource repeating ie same ids being returned
…is because you’re both preloading and left_joining the same tables in the same query. It looks like you could delete your joins (leaving your specifically-queried preloads) and stop getting duplicate records.
As for what gets returned, if it were me, I’d just drop the select statement. Preloading will return the associations, and I’d move forward. Perhaps there are business-reasons you strongly prefer to bang your head against nested select syntax to return only 3 fields alongside associations. I wouldn’t choose to bang my head against select syntax when I could just filter out fields in Elixir, but that’s me. ![]()
Also Liked
tanweerdev
I just created a repository to help identify the issue has_many preload issue.
Please
- Clone
- mix deps.get
- mix ecto.setup
- mix test
and there is one file has_many_test. Please have a look, it describes the issue
Last Post!
tanweerdev
You are correct. Atleast removing (left) join from has_many association it worked perfectly. Thanks
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









