Использование:inner_lateral в Ecto Elixir

#elixir #ecto

#elixir #ecto

Вопрос:

Я пытался использовать ecto :inner_lateral , и я написал этот запрос

 SnapshotExtractor
|> order_by(desc: :created_at)
|> limit(1)
|> join(:inner_lateral, [se], cam in fragment("SELECT * FROM cameras as cam WHERE cam.id = ?", se.camera_id))
|> select([se, cam], { se.from_date, se.to_date, se.interval, se.schedule, cam.exid, cam.timezone})
|> Repo.one
  

Он работает нормально и дает мне хорошие результаты, но он дает мне объект без имени, без имени с результирующими значениями.. Вопрос в том, можем ли мы также добавлять имена к значениям? мои результирующие значения

 {#Ecto.DateTime<2016-02-25 00:00:00>, #Ecto.DateTime<2016-02-25 00:00:00>, 0,
 %{"Friday" => [], "Monday" => ["0:0-0:0"], "Saturday" => [], "Sunday" => [],
   "Thursday" => [], "Tuesday" => [], "Wednesday" => []}, "oscar2", nil}
  

Ответ №1:

То, что вы называете «неназванным объектом», является кортежем. Вы получаете это обратно, потому что ваше select выражение является кортежем. Вам, вероятно, нужна карта, если вы хотите дать им имена. Чтобы вернуть карту, просто верните карту в select выражении:

 |> select([se, cam], %{ from_date: se.from_date, to_date: se.to_date, interval: se.interval, schedule: se.schedule, exid: cam.exid, timezone: cam.timezone})
  

Если вы присвоите возвращаемое значение foo , вы сможете получить доступ к полям foo.from_date с помощью foo.to_date , и т.д.

Комментарии:

1. Спасибо.. Я не знал об этом! через 7 минут.. Я приму ответ.