2016-11-30 2 views
0

私はここでエリキシルを使ってデータをシードする方法は?

for elem1, elem2, elem3 in list1, list2, list3 do 
    Repo.insert{elem1, elem2, elem3} 
end 

の下に擬似コードのようにparalelでリストを反復処理する方法は、私のデータである見つけることができないので、私は、データベースにデータをシードしようとしているが、それは働いていません。

@list_of_names  ~w(Daniel Admin Goran Tomislav User1) 
@list_of_usernames ~w(daniel admin goran marex User2) 
@list_of_passwords ~w(123456 000000 123456 123456 123456) 

と私はそれをユーザー構造体を使用して挿入する必要があります。

Repo.insert!(%User{ 
    name: name, 
    username: username, 
    password: password 
}) 

私はdocsを試しましたが、このコードは機能しません。

defmodule Rumbl.DatabaseSeeder do 

    alias Rumbl.Repo 
    alias Rumbl.User 



    @list_of_names  ~w(Daniel Admin Goran Tomislav Marin) 
    @list_of_usernames ~w(daniel admin goran marex marin) 
    @list_of_passwords ~w(123456 000000 123456 123456 123456) 

    def insert_user do 
    Repo.insert!(%User{ 
     name:  (@list_of_names  |> Enum.take_random), 
     username: (@list_of_usernames |> Enum.take_random), 
     password: (@list_of_passwords |> Enum.take_random) 
    }) 
    end 
end 
(1..5) |> Enum.each(fn _ -> Rumbl.DatabaseSeeder.insert_user end) 

エラーの後:mix run priv\repo\seeds.exs

** (UndefinedFunctionError) function Enum.take_random/1 is undefined or private. Did you mean one of: 

     * take_random/2 

    (elixir) Enum.take_random(["Daniel", "Admin", "Goran", "Tomislav", "Marin"]) 
    priv/repo/seeds.exs:27: Rumbl.DatabaseSeeder.insert_user/0 
    (elixir) lib/enum.ex:657: anonymous fn/3 in Enum.each/2 
    (elixir) lib/enum.ex:1628: anonymous fn/3 in Enum.reduce/3 
    (elixir) lib/range.ex:92: Enumerable.Range.reduce/5 
    (elixir) lib/enum.ex:1627: Enum.reduce/3 
    (elixir) lib/enum.ex:656: Enum.each/2 
    (elixir) lib/code.ex:363: Code.require_file/2 
    (mix) lib/mix/tasks/run.ex:71: Mix.Tasks.Run.run/1 
    (mix) lib/mix/task.ex:296: Mix.Task.run_task/3 
    (mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2 
    (elixir) lib/code.ex:363: Code.require_file/2 
+1

コード内に「<%= ... %>」を使用する必要はありません。それはあなたがeexを使っている場合のみです。あなたが実際に得ているエラーは何ですか?また、あなたは '<%= ... %>'を使う必要があると思ったのですか? –

+0

あなたはそのエラーについて何を理解していませんか? 2つの引数を取る関数を呼び出そうとしていますが、あなたは1を渡すだけです。[ここをクリック](http://elixir-lang.org/docs/stable/elixir/Enum.html#take_random/2)関数を使用します。 –

答えて

3

あなたは3つのリストを圧縮するために二回Enum.zip/2を使用し、それらの上にfor反復処理を使用することができます。エリクサーは3つのリストを圧縮するEnum.zip/3機能を持っていたが、そうでない場合、これは明確になり

names = ~w(Daniel Admin Goran Tomislav User1) 
usernames = ~w(daniel admin goran marex User2) 
passwords = ~w(123456 000000 123456 123456 123456) 

for {{name, username}, password} <- name |> Enum.zip(usernames) |> Enum.zip(passwords) do 
    Repo.insert!(%User{ 
    name: name, 
    username: username, 
    password: password 
    }) 
end 

:このコードを仮定し

priv/repo/seeds.exsのようなEXSファイルになります。

+0

今すぐ試してみて、それが実行されているかどうかを確認してください – Daniel

+0

挿入前にパスをハッシュしています – Daniel

+1

Repo.insert!(User.changeset(%User {}、%{name:..、...} )) 'します。 – Dogbert

関連する問題