
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

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

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 на этой структуре.

Alex
16.03.2018
12:13:34

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-е есть такой.

Артем
16.03.2018
18:39:02

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