Size: a a a

2021 January 12

B

Bogdan in pro.elixir
(fun () -> ())
почему бы insert_all не работало с changeset-ом например
Можно функцию поднять и заработают changeset-ы через Repo.insert_all
источник

B

Bogdan in pro.elixir
Могу поделится функцией если нужно
источник

((

(fun () -> ()) in pro.elixir
Bogdan
Могу поделится функцией если нужно
о, давай, было бы круто)
источник

B

Bogdan in pro.elixir
def start(changesets) do
   changesets
   |> split
 end

 defp split(changeset) do
   changeset
   |> Enum.split_with(fn %Ecto.Changeset{} = item_changeset -> item_changeset.valid? end)
   |> changeset_valid?()
 end

 defp changeset_valid?(valid?) do
   case valid? do
     {valid_item_changeset, []} ->
         valid_item_changeset
         |> Stream.map(fn %Ecto.Changeset{} = item_changeset -> Ecto.Changeset.apply_changes(item_changeset) end)
         |> Stream.map(fn item -> item_into_map(item) end)
         # add timestamps
         |> Enum.map(fn struct ->
         with_inserted = Map.put(struct, :inserted_at, Timestamp.now())
         Map.put(with_inserted, :updated_at, Timestamp.now())
         end)

     {_valid_item_changesets, invalid_item_changesets} -> "Changeset to struct reply: not valid changeset"
   end
 end

 defp item_into_map(item) do
   item
   |> Map.from_struct()
   |> Stream.reject(fn {_key, nil} ->
     true

   {_key, %_struct{}} ->
     # rejects __meta__: #Ecto.Schema.Metadata<:built, "items">
     # and association: #Ecto.Association.NotLoaded<association :association is not loaded>
     true

   _other ->
    false
 end)
 |> Enum.into(%{}) # not really necessary since `insert_all` also accepts a list of lists.
 end
источник

B

Bogdan in pro.elixir
Вроде вот это
источник

((

(fun () -> ()) in pro.elixir
Bogdan
def start(changesets) do
   changesets
   |> split
 end

 defp split(changeset) do
   changeset
   |> Enum.split_with(fn %Ecto.Changeset{} = item_changeset -> item_changeset.valid? end)
   |> changeset_valid?()
 end

 defp changeset_valid?(valid?) do
   case valid? do
     {valid_item_changeset, []} ->
         valid_item_changeset
         |> Stream.map(fn %Ecto.Changeset{} = item_changeset -> Ecto.Changeset.apply_changes(item_changeset) end)
         |> Stream.map(fn item -> item_into_map(item) end)
         # add timestamps
         |> Enum.map(fn struct ->
         with_inserted = Map.put(struct, :inserted_at, Timestamp.now())
         Map.put(with_inserted, :updated_at, Timestamp.now())
         end)

     {_valid_item_changesets, invalid_item_changesets} -> "Changeset to struct reply: not valid changeset"
   end
 end

 defp item_into_map(item) do
   item
   |> Map.from_struct()
   |> Stream.reject(fn {_key, nil} ->
     true

   {_key, %_struct{}} ->
     # rejects __meta__: #Ecto.Schema.Metadata<:built, "items">
     # and association: #Ecto.Association.NotLoaded<association :association is not loaded>
     true

   _other ->
    false
 end)
 |> Enum.into(%{}) # not really necessary since `insert_all` also accepts a list of lists.
 end
спасибо!
источник

B

Bogdan in pro.elixir
(fun () -> ())
спасибо!
Только Timestamp.now() замени, оно у меня с другого модуля тянет зависимость.
источник

ML

Maksim Lapshin in pro.elixir
Anton Lapshin
на мой взгляд liveview для всяких внутрянок хорош, когда апи наружу особо не нужен или не коррелирует с тем апи, которое внутри
Короче, это для ситуаций, когда бекендер делает гуй без фронтендера
источник
2021 January 13

LL

Lama Lover in pro.elixir
Bogdan
def start(changesets) do
   changesets
   |> split
 end

 defp split(changeset) do
   changeset
   |> Enum.split_with(fn %Ecto.Changeset{} = item_changeset -> item_changeset.valid? end)
   |> changeset_valid?()
 end

 defp changeset_valid?(valid?) do
   case valid? do
     {valid_item_changeset, []} ->
         valid_item_changeset
         |> Stream.map(fn %Ecto.Changeset{} = item_changeset -> Ecto.Changeset.apply_changes(item_changeset) end)
         |> Stream.map(fn item -> item_into_map(item) end)
         # add timestamps
         |> Enum.map(fn struct ->
         with_inserted = Map.put(struct, :inserted_at, Timestamp.now())
         Map.put(with_inserted, :updated_at, Timestamp.now())
         end)

     {_valid_item_changesets, invalid_item_changesets} -> "Changeset to struct reply: not valid changeset"
   end
 end

 defp item_into_map(item) do
   item
   |> Map.from_struct()
   |> Stream.reject(fn {_key, nil} ->
     true

   {_key, %_struct{}} ->
     # rejects __meta__: #Ecto.Schema.Metadata<:built, "items">
     # and association: #Ecto.Association.NotLoaded<association :association is not loaded>
     true

   _other ->
    false
 end)
 |> Enum.into(%{}) # not really necessary since `insert_all` also accepts a list of lists.
 end
Я бы заменил все Stream тут на обычный Enum
Например, Stream.reject |> Enum.into(%{}) превращается в один обычный Enum.reduce

Проблема в том, что Stream сам по себе очень медленный и Stream.map |> Stream.map |> Stream.map медленнее чем Enum.map |> Enum.map |> Enum.map (и точно медленнее чем один Enum.map)

Но это так, на заметку, это не сильная оптимизация будет
источник

B

Bogdan in pro.elixir
Lama Lover
Я бы заменил все Stream тут на обычный Enum
Например, Stream.reject |> Enum.into(%{}) превращается в один обычный Enum.reduce

Проблема в том, что Stream сам по себе очень медленный и Stream.map |> Stream.map |> Stream.map медленнее чем Enum.map |> Enum.map |> Enum.map (и точно медленнее чем один Enum.map)

Но это так, на заметку, это не сильная оптимизация будет
Не знал, я думал он наоборот за один проход все делает если Stream.map пайпать, а Enum.map за 3 соответственно.
источник

LL

Lama Lover in pro.elixir
Bogdan
Не знал, я думал он наоборот за один проход все делает если Stream.map пайпать, а Enum.map за 3 соответственно.
Ну, у тебя в одном проходе вызовется 3 функции
Либо в трёх по одной

Вытащить элемент из списка и применить к нему функцию будет быстрее, чем достать cписок обёрнутых функций из структуры, выполнить их, проверить на окончание стрима, проверить на наличие аккумуляторов, положить новый enum в стрим и т.д.
источник

LL

Lama Lover in pro.elixir
Поздравляю с гетом, кстати
источник

B

Bogdan in pro.elixir
Lama Lover
Ну, у тебя в одном проходе вызовется 3 функции
Либо в трёх по одной

Вытащить элемент из списка и применить к нему функцию будет быстрее, чем достать cписок обёрнутых функций из структуры, выполнить их, проверить на окончание стрима, проверить на наличие аккумуляторов, положить новый enum в стрим и т.д.
Понял, спасибо
источник

A ß in pro.elixir
Bogdan
Не знал, я думал он наоборот за один проход все делает если Stream.map пайпать, а Enum.map за 3 соответственно.
не факт что так будет всегда, надеемся на жит
источник

AL

Anton Lapshin in pro.elixir
Maksim Lapshin
Короче, это для ситуаций, когда бекендер делает гуй без фронтендера
Именно🙂
источник

AD

Aaron Delarge in pro.elixir
Maksim Lapshin
Короче, это для ситуаций, когда бекендер делает гуй без фронтендера
Это ответ, который я искал хд
источник

A

Aldar in pro.elixir
Нашел ВУЗ где изучают Эликсир))
источник

JL

Johan Liebert in pro.elixir
Aldar
Нашел ВУЗ где изучают Эликсир))
что за ВУЗ ?
источник

A

Aldar in pro.elixir
Johan Liebert
что за ВУЗ ?
источник

SZ

Sergei Zobov in pro.elixir
там небось @fried_zucchini преподаёт
источник