@proelixir

Страница 910 из 1045
Buckler
16.03.2018
10:25:21
Hello, Andrew! Please, calculate: 43+79=... If you don't answer - you'll get banned from the channel... Good luck!

Alex
16.03.2018
10:27:09
> put_in > In case any of entries in the middle returns nil, an error will be raised when trying to access it next. да сколько можно-то

все put_in, которые я встречал создавали путь по мапе

что вообще за пиздец

Google
Evgeny
16.03.2018
10:46:46
Вопрос по Ecto, как сделать так, чтобы некое поле схемы заполнялось из другой связанной схемы? has_one/3, насколько я понял тянет всю запись из связанной таблицы, а мне нужно всего лишь одно поле.

Что-то вроде SELECT users.*, ages.age FROM users LEFT JOIN ages USING(user_id);

Никита
16.03.2018
10:56:50
select

Evgeny
16.03.2018
10:58:53
select
Как сделать select я и так знаю. Я спрашиваю что мне в схеме написать?

Alex
16.03.2018
11:06:03
так вот, Kernel.put_in это единственный put_in который есть?

Alexey
16.03.2018
11:07:25
есть еще update_in

Alex
16.03.2018
11:16:01
Ну он как-то не то

Блин, ну вот же подстава. Я наивно думал, что они *_in передрали целиком из clojure.core, но нет, даже здесь какая-то ебучая самодеятельность

Dmitry
16.03.2018
11:31:22
@nwalker Открой issue или спроси, почему так сделано.

Alexey
16.03.2018
11:32:55
PUTIN!

Alex
16.03.2018
11:34:49
@nwalker Открой issue или спроси, почему так сделано.
да какая уже теперь разница, оно уже сделано

Dmitry
16.03.2018
11:35:16
@nwalker Чтобы изменить в будущем.

Alex
16.03.2018
11:35:22
и менять никто не будет

Google
Dmitry
16.03.2018
11:36:02
Вероятно, но не факт. Но если такие темы не поднимать, то вообще никогда ничего не поменяется.

Сделано плохо, ну и пусть дальше плохо остается.

О, есть дискуссия на форуме.

https://elixirforum.com/t/kernel-put-in-on-nil-values/3564 - в общем, видимо никому не мешает, никто не отписался в ней.

Вопрос: my_map = %{ foo: %{ bar: %{ baz: "first" }, bar1: %{ baz: "second" } } } my_map |> put_in([:foo, :bar, :baz], "Hello, first") |> put_in([:foo, :bar1, :baz], "Hello, second") deep_update(my_map, [:foo, [:bar, {:baz, "Hello, first"}], [:bar1, {:baz, "Hello, second"}]])

Как по дизайну должен выглядить deep_update, который бы позволял бы обновлять сразу несколько полей.

deep_update my_map, %{foo: %{bar: %{baz: "Hello, first"}, bar1: %{baz: "Hello, second"}}}

Или вот так

Dmitry
16.03.2018
12:04:44
Так сделано, потому что deep nesting structure это не только map, но и keyword

И откуда он знает, что тебе создать?

Ни откуда

А в get_in зато можно что угодно накрутить - и он заберёт

Плюс естественно структура

Может быть разная внутри

А он может создать только мапу

Потому все explicit

Dmitry
16.03.2018
12:07:54
@Virviil Понятное дело, что так чисто.

@Virviil Но на практике все равно все используют в основном map-ы. И было бы удобно действительно создавать такие пути

У нас есть deep_put - решается в 2 строчки кода.

Наверное каждый, кто активно использует put_in, get_in пишет свой deep_put, который создает пути.

Google
Alex
16.03.2018
12:10:06
Так сделано, потому что deep nesting structure это не только map, но и keyword
Да, я уже заметил. Значит, put_in определён только для deep map

Dmitry
16.03.2018
12:10:44
put_in работает со всеми структурами, в том числе и с Keyword.

> put_in [a: [b: 1]], [:a, :b], 2 [a: [b: 2]]

* Со всеми, что имплементируют Access - протокол

Alex
16.03.2018
12:12:48
Короче, я бы выработал позицию исходя из того, что kwlist это для чтения и может быть обновления, а map - полноценный контейнер.

Dmitry
16.03.2018
12:12:50
У нас кстати, есть своя структура, которая struct - и еще каждый put_in записывает в changelog и потом обновления идут в базу в виде изменений и diff-ов, а не целой структурой, а пользуемся put_in, update_in на этой структуре.

Dmitry
16.03.2018
12:13:50
А нам такая пригодилась.

Это с одной стороны, с другой стороны 95% всех случаев - это вложенные map-ы.

С которыми каждый, кто имеет дело пишет свой deep_put

И вот update нескольких полей одновременно - тут тоже не решенная проблема.

update и создание.

https://github.com/PragTob/deep_merge

Что-то такое есть.

Alex
16.03.2018
12:24:57
Короче, как все писали велосипеды, так и пишут

Dmitry
16.03.2018
12:27:00
У нас deep_put - на самом деле, оказывается в одном месте используется

Alex
16.03.2018
12:28:13
Я его везде для конструирования данных в тестах использую

Где надо входящий json собрать

ммм. в мап-литералах ключи в кавычках тоже превращаются в атомы.

delicious

Google
Dmitry
16.03.2018
14:15:36
Логично, если ты используешь ':'

Так же как и :"atom" который в кавычках.

Alik
16.03.2018
14:24:23
Привет. Кто-то пользовался ecto_enum? У меня ecto 2.2.7, при компиляции выдаёт invalid or unknown type StatusEnum for field :type, т.е. как я понимаю ecto_enum не регистрирует тип в ecto. Что нужно сделать чтобы заработало?

Dmitry
16.03.2018
14:25:40
Отдельный файлик сделал как в примере указано?

у меня без этого не заводилось

Alik
16.03.2018
14:26:20
отдельный

у меня приложение внутри umbrella, может это как-то влиять?

Dmitry
16.03.2018
14:27:09
покажи как описал тип

Alik
16.03.2018
14:27:50
defmodule GraphqlApi.Enums do import EctoEnum defenum StatusEnum, registered: 0, active: 1, inactive: 2, archived: 3 end скопировал из доки

вообще нужно postgres-like объявление (defenum/3), но оно тоже не работет, решил это попробовать как более простое, но результат тот же

пробовал делать require GraphqlApi.Enums из другого файла, не помогло

Dmitry
16.03.2018
14:29:51
defmodule убери для постгреса да, определить надо defenum/3 defenum StatusEnum, :status, [:registered, :active, :inactive, :archived] и в миграции уже на :status ссылаешься

Alik
16.03.2018
14:30:38
без defmodule заработало, спасибо !!!

Fey
16.03.2018
18:28:53
iex(1)> ~D[2999-12-15] > ~D[2018-03-16] false wtf? 0_o

Александр
16.03.2018
18:31:22
хммм, а ведь верно

что за магия?

Fey
16.03.2018
18:31:42
iex(2)> ~D[2999-12-16] > ~D[2018-03-16] true

Dmitry
16.03.2018
18:32:34
@feymartynov нужно использовать что-то типа Timex.compare

@feymartynov Магия в том, что > - не полиморфная операция.

А IO.inspect ~D[2999-12-15], structs: false

Google
Dmitry
16.03.2018
18:34:34
Под капотом вот такая вот структура

%{__struct__: Date, calendar: Calendar.ISO, day: 15, month: 12, year: 2999}

Fey
16.03.2018
18:35:10
а, ясненько

Dmitry
16.03.2018
18:35:11
Соответственно здесь применяются правила сравнения двух map-ов.

Fey
16.03.2018
18:35:12
спасибо

Dmitry
16.03.2018
18:37:21
В общем, здесь вначале будут дни сравниваться, соответственно там где day больше, та структура и будет больше. Поэтому сравнивать их как структуры нельзя, нужно использовать протокол. В Timex-е есть такой.

Alex
16.03.2018
18:44:32
c tuple format без таймзоны должно правильно выходить

Dmitry
16.03.2018
18:45:27
@nwalker Работает со struct, но не так как ожидается. Потому что эта операция не полиморфная и не поддерживает имплементацию своей функции сравнения.

Fey
16.03.2018
18:47:59
а, ну собсно в мануале об этом есть https://hexdocs.pm/elixir/Date.html#module-comparing-dates

Evgeny
17.03.2018
17:45:40
вопросик, а при передаче Map или List в другой процесс, будет передана полная копия? А то вдруг у меня дерево на полгигабайта.

походу будет копироваться, кроме передачи больших бинарных данных.

и это печально

Aldar
17.03.2018
17:54:18
Иначе бы сборщик мусора пришлось переделывать

ⰿⰰⰾⱏ
17.03.2018
18:30:38
походу будет копироваться, кроме передачи больших бинарных данных.
а закодить оный въ видѣ большого бинаря можно ли интересно?)

Страница 910 из 1045