In my changeset, I have the following behavior that connects objects together:
def link_delegates(changeset) do
changeset = %Changeset{changeset | data: Repo.preload(changeset.data, :rncp_delegates)}
rncp_delegates = get_field(changeset, :rncp_delegates)
included_delegates = get_field(changeset, :included_delegates)
excluded_delegates = get_field(changeset, :excluded_delegates)
delegates =
(Enum.uniq(rncp_delegates ++ included_delegates) -- excluded_delegates)
|> Enum.sort_by(&(&1.id))
changeset
|> put_assoc(:delegates, delegates)
end
When I execute Repo.get(Certification, 2014) |> Certification.changeset() |> Repo.update()
, all the preload go well, I end up with a list of %Delegate{}
s but at Repo.update()
time, before the actual SQL UPDATE
happens, I get:
[debug] QUERY OK db=0.1ms idle=839.7ms
begin []
[debug] QUERY OK source="certifications" db=20.6ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[15]]
[debug] QUERY OK source="certifications" db=72.5ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[16]]
[debug] QUERY OK source="certifications" db=76.7ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[18]]
[debug] QUERY OK source="certifications" db=47.3ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[19]]
[debug] QUERY OK source="certifications" db=82.3ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[23]]
[debug] QUERY OK source="certifications" db=19.5ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[25]]
[debug] QUERY OK source="certifications" db=56.2ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[26]]
[debug] QUERY OK source="certifications" db=57.8ms
SELECT c0."id", c0."rncp_id", c0."is_rncp_active", c0."is_active", c0."slug", c0."acronym", c0."label", c0."level", c0."last_rncp_import_date", c0."end_of_rncp_validity", c0."activities", c0."abilities", c0."activity_area", c0."accessible_job_type", c0."newer_certification_id", c0."inserted_at", c0."updated_at", d1."id" FROM "certifications" AS c0 INNER JOIN "delegates" AS d1 ON d1."id" = ANY($1) INNER JOIN "certifications_delegates" AS c2 ON c2."delegate_id" = d1."id" WHERE (c2."certification_id" = c0."id") ORDER BY d1."id" [[55]]
which happens for unknown reasons as everything’s already loaded.
I’m sure this has to do with the put_assoc
as if I remove it, the behavior doesn’t happen.
Anyone has an idea? I’m aware this can be very context-specific hence not easy to debug, but any hint on why SELECT
queries happen on put_assoc
is welcome!
Thanks