How to filter preloads on an Ecto query (postgres), on: isn't working as expected

14 views Asked by At
      from(t in Task,
        join: tf in TaskFactory,
        on: t.task_factory_id == tf.id,
        left_join: ts in TaskSkip,
        # Expect the `and is_nil(ts.deleted_at)` to not return deleted records. Why are they returned?
        on: ts.task_id == t.id and is_nil(ts.deleted_at) and ts.until >= ^start_of_day,
        preload: [:task_factory, :task_skips],
        where: fragment("? at time zone ?", t.interval_start, ^timezone) <= ^start_of_day,
        where: is_nil(t.interval_end) or t.interval_end > ^now,
        where: is_nil(t.deleted_at),
        where: t.lsid == ^lsid,
        where: is_nil(ts.deleted_at)
      )

I would expect on to return ones that aren't deleted at.

Yet I get these two results

[
  %RecurList.Task{
    ...
    task_skips: [
      # Why isnt this being filtered out?
      %RecurList.TaskSkip{
        ...
        deleted_at: ~U[2023-11-20 23:07:33Z]
      }
    ]
  },
  # This is expected
  %RecurList.Task{
    ...,
    task_skips: [],
  }
]
0

There are 0 answers