Background
I have a a couple of queries that result in the archival of some metadata items. My objective is to merge these queries into one (if possible).
Code
meta_item_ids_to_archive =
Post
|> where([post], post.archive_meta)
|> select([post], %{item_id: post.meta_id})
|> subquery()
archive_meta_items_query =
Meta
|> join(:inner, [item], item_to_archive in ^meta_item_ids_to_archive,
on: item.id == item_to_archive.item_id
)
########
later on
########
Multi.update_all(
:query_a,
archive_meta_items_query,
set: [archived: true]
)
So my original query starts with Post
and then int eh subsequent query I start with Meta
. I want to archive items in the Meta
table. My first attempt at merging these queries was the following:
new_query =
Post
|> where([post], post.archive_meta)
|> join(:inner, [post], item_to_archive in Meta,
on: post.meta_id == item_to_archive.item_id
)
Multi.update_all(
:query_a,
new_query,
set: [archived: true]
)
Problem
Now, the issue here is that this won’t work:
field
archived
inupdate
does not exist in schema Post in query (…):
Because my new_query
starts with Post
instead of Meta
, the update operation fails.
Question
- Is there a way to tell Ecto “I want the
Meta
table returned instead of Post?” - If now, how can I solve this?