@proelixir

Страница 927 из 1045
Moi_nik
09.04.2018
11:57:11
Господа, есть тривиальная задача сделать сиды из csv. По идее ничего сложного, но микс вылетает с ошибкой: ** (FunctionClauseError) no function clause matching in Ecto.Repo.Schema.insert/4 В какую сторону копать?

Вот сам seed alias Myapp.{Repo, V1.Myapp} File.stream!(Path.expand("priv/repo/csv/file_for_seed.csv")) |> CSV.decode!(headers: [:user_id, :name, :country]) |> Enum.each(&Repo.insert!/1)

Традиционно я полез в ecto, и в саму функцию incert def insert(repo, adapter, %Changeset{} = changeset, opts) when is_list(opts) do do_insert(repo, adapter, changeset, opts) end Возникло ощущение что функция не получила changeset. Но по интернетам нигде дополнительных аргументов в подобном случае не передают.

Никита
09.04.2018
12:04:37
CSV.decode!(headers: [:user_id, :name, :country]) возвращает ченджсет?

Google
Moi_nik
09.04.2018
12:07:27
Точно не могу сказать, я не настоящий сварщик а только учусь. Похоже что эта строка возвращает мап %{country: "Phillipines", name: "Cindy Daniels", user_id: "0456-cc27"}

Может быть есть пример хорошего сида?

Никита
09.04.2018
12:11:54
Ну вот это дело надо передать в функцию, которая вернет ченджсет

для нужной структуры

Moi_nik
09.04.2018
12:14:28
кажется я понял типа надо городить отдельную функцию, которой передавать этот мап, и которая отдаст его в пайп ченджсетом?

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

В любом случае спасибо, проблема локализована :)

Dmitry
09.04.2018
12:56:46
Хорошо, что кто-то занялся, провёл часы в дискуссиях и сделал это.

Alex
09.04.2018
13:18:06
ну есть же почти-общеизвестный gen_server:enter_loop

Marsel
09.04.2018
13:27:21
а никто jason не юзал в проекте с distillery?

Dmitry
09.04.2018
13:32:34
@nwalker Есть с ходящим за ним хвостом boilerplate-ом....А на практике я вижу очень часто используют self() ! init

Alex
09.04.2018
13:33:43
Google
Dmitry
09.04.2018
13:34:37
Теперь есть новый правильный путь.

Alex
09.04.2018
13:36:36
обратно-несовместимый

потом еще какой-нибудь замечательный человек напишет в стайлгайде "используйте только handle_continue", proc_lib considered harmful и еще что-нибудь такое

ну или там про gen_statem все еще никто не будет знать, потому что все эликсирные туториалы останавливаются на gen_server

Dmitry
09.04.2018
13:42:53
@nwalker Твое предложение, всем переходить на proc_lib или gen_statem - как я понимаю?

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

Без получения какой-либо пользы.

Alex
09.04.2018
13:45:00
если тебе нужна кастомная инициализация - proc_lib. если стейты - ручками пока просто(что не принципиально отличается от handle_continue), gen_statem когда сложно со старта.

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

Dmitry
09.04.2018
13:47:22
Когда все случаи (или 99%), где нужна кастомная реализация реализуются более простым и надежным вариантом.

1 строчка против 10-15 строчек с enter_loop-ом.

По сути, вопрос лишь в этом.

Alex
09.04.2018
13:49:49
при этом enter_loop позволяет легче двигать момент, когда мы отпускаем супервизор

Dmitry
09.04.2018
13:50:57
В 99% continue - это то, что нужно.

Остальное можно через proc_lib делать, когда нужно все кастомное.

Dmitry
09.04.2018
13:58:03
Ребят, вопрос такой - надо сделать в БД чтобы только у одной строчки был default = true, у остальных соответственно false. Вопрос - как это сделать правильно

Собственно проблема - как правильно запретить удаление дефолта

Dmitry
09.04.2018
13:59:11
И как обновить, чтобы дефолт перезаписался

Anatoliy Kovalchuk
09.04.2018
13:59:16
Вынести в отдельную таблицу запись с айди тру

Google
Dmitry
09.04.2018
13:59:32
Триггеры?
Хотелось бы без них

Чтобы соответственно в пачке выдачи это поле появилось

Anatoliy Kovalchuk
09.04.2018
14:01:13
Left join

Dmitry
09.04.2018
14:01:35
Тогда будут null

А надо - false

Dmitry
09.04.2018
14:01:43
@nwalker https://github.com/erlang/otp/pull/1429#issuecomment-297364720 => "Of course one could write the OTP behaviour using proc_lib or the undocumented gen but then the implementation is much more complex." В дискуссии обсуждались уже все преимущества, не нужно ничего придумывать.

Yaroslav
09.04.2018
14:02:52
@Virviil совсем необязательно false, достаточно стоит true или не стоит

Dmitry
09.04.2018
14:03:53
Хз, у нас всё равно отдельный резолвер будет отрабатывать на каждую отдельную запись

Другое дело, чтобы он в базу не ходил

Anatoliy Kovalchuk
09.04.2018
14:04:15
Можешь же проверять left join some_table st on ... Select st.id <> null

Dmitry
09.04.2018
14:05:33
Можешь же проверять left join some_table st on ... Select st.id <> null
Мне кажется, мы о разных кейсах. Я о том, как вернуть все строчки, только чтобы у них было доп.поле default

А ты о том, как его найти

Dmitry
09.04.2018
14:08:16
Можешь же проверять left join some_table st on ... Select st.id <> null
not is_null только, или как-то иначе в зависимости от бд

Anatoliy Kovalchuk
09.04.2018
14:09:06
Select users.*, (! Is_null(settings.id)) as default Left join settings on users.id == settings.user_id

Артем
09.04.2018
14:10:16
может надо id дефолт юзера хранить вообще не в БД?

Anatoliy Kovalchuk
09.04.2018
14:10:17
Получится что для всех пользователей кого нету в таблице settings default == false

Dmitry
09.04.2018
14:10:33
в чем проблема update tableA set column_A = case when id == 1 then true else false end

Dmitry
09.04.2018
14:11:08
Да ни в чём не проблема

Google
Dmitry
09.04.2018
14:11:15
Просто интересно как правильно

Так то можно вообще всё в одной таблице хранить

И update_all на ней делать

Или можно сделать view

Правда у нас не юзер

Update меня сильно пугает

Артем
09.04.2018
14:16:27
ну так и положи его куда-нибудь в dets

Dmitry
09.04.2018
14:16:29
На денормализованной базе

Артем
09.04.2018
14:16:46
1 ключ и никаких апдейтов чего-то ещё

Dmitry
09.04.2018
14:27:33
В этом что-то есть конечно

Осталось только понять "что"

Buckler
09.04.2018
14:33:45
Hello, Nykolay! Please, calculate: 34+46=... If you don't answer - you'll get banned from the channel... Good luck!

Dmitry
09.04.2018
14:36:39
Артем
09.04.2018
14:37:57
ну а на самом деле всё-же постановка задачи неправильная by design. нельзя же добавлять всем юзерам стоблец ради того, чтобы указывать на одного.

имхо

Dmitry
09.04.2018
14:39:32
И что делать тогда?

Админка как выглядеть должна

Google
Dmitry
09.04.2018
14:39:50
Вот вопрос

Dmitry
09.04.2018
14:41:02
у тебя реляционная бд?

Dmitry
09.04.2018
14:41:31
Ты шутишь? Конечно

Dmitry
09.04.2018
14:42:07
Просто ребята нормальную вещь советуют, куда уж правильней не знаю - создаешь отдельную таблицу, где хранишь айдишник нужной записи

Dmitry
09.04.2018
14:42:15
Мы тут триггеры обсуждаем, джойны))

Dmitry
09.04.2018
14:42:21
и туда за ней ходишь

триггеры зло, не надо)

Артем
09.04.2018
15:03:00
И что делать тогда?
а чо, этого юзера прям никак к другой модели не присоединить? это же дефолт юзер для чего-либо?

Dmitry
09.04.2018
15:06:05
В смысле к другой модели?

Dmitry
09.04.2018
15:10:21
Наверное речь о схеме

Rustam
09.04.2018
15:20:56
Всем привет. Programming Phoenix издание 1.3 от 1.0 сильно отличается? Есть 1.0, это 2016 год, 1.4 - еще не вышла, 1.3 - вроде как последняя на данный момент редакция.

Если кто поделится, то вообще супер



Анастасия
09.04.2018
16:01:35
не читала, но скорее всего книги соответствуют версиям фреймворка

Rustam
09.04.2018
16:04:00
да, я как раз не про версию фреймворка пишу, в доступной мне версии книги год издания 2016, что мне кажется - большой срок, за который актуальность книги может сильно пострадать

Артем
09.04.2018
16:05:12
ну там же контексты в 1.3, все дела

моделек нет больше ((

Rustam
09.04.2018
16:10:09
Прочитал/прозанимался с "Phoenix for Rails developers" (Elvio Vicosa) - совсем слабая книга. Не рекомендую

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