2016-04-23 21 views
0

フェニックスフレームワークとエリクシールの新機能です。シード関数を複数回実行しようとしています。それはデータをかなりうまく取り込んだり、期待通りにデータを取り込んでいますが、実行中にエラーが発生します。ここでエクトシードファイルを実行中にエラーが発生しました

は、シードファイルは

alias FatLobster.Repo 
alias FatLobster.Recipe 
alias FatLobster.Place 
alias FatLobster.Review 
import Faker 
defmodule RecurssionSeed do 

    def multiply_seeder(x,n) 
    when x <=n do 
     recipe_seed 
     place_seed 
     review_seed 
     x = x+1 
     multiply_seeder(x,n) 
    end 


    def recipe_seed do 
    Repo.insert(%Recipe{ 
     recipe_title: Faker.Lorem.word , 
     recipe_description: Faker.Lorem.paragraph , 

     cover_img: Faker.Avatar.image_url() , 
     picture_one: Faker.Avatar.image_url() , 
     picture_two: Faker.Avatar.image_url() , 
     picture_three: Faker.Avatar.image_url() , 
     user_id: Enum.random(1..1000), 
     upvote_count: Enum.random(1..1000), 
     downvote_count: Enum.random(1..1000) 

     }) 
    end 

    def place_seed do 
     Repo.insert(%Place{ 
     places_title: Faker.Lorem.word, 
     places_description: Faker.Lorem.paragraph, 
     cover_img: Faker.Avatar.image_url(), 
     picture_one: Faker.Avatar.image_url(), 
     picture_two: Faker.Avatar.image_url(), 
     picture_three: Faker.Avatar.image_url(), 
     upvote_count: Enum.random(1..300), 
     downvote_count: Enum.random(1..1000) 



     }) 
    end 

    def review_seed do 
     Repo.insert(%Review{ 
     review_title: Faker.Lorem.word, 
     review_description: Faker.Lorem.sentence, 
     cover_img: Faker.Avatar.image_url, 
     picture_one: Faker.Avatar.image_url, 
     picture_two: Faker.Avatar.image_url, 
     picture_three: Faker.Avatar.image_url, 

     user_id: Enum.random(1..100), 
     upvote_count: Enum.random(1..1000), 
     downvote_count: Enum.random(1..250), 



     }) 
    end 
end 


RecurssionSeed.multiply_seeder(1,25) 

あるしかし、私は、端末内のシードコマンドを実行しながら、それがpostgreデータベースを投入した後にエラーが表示されます。ここ

はエラーメッセージです、

** (FunctionClauseError) no function clause matching in RecurssionSeed.multiply_seeder/2 
    priv/repo/seeds.exs:22: RecurssionSeed.multiply_seeder(26, 25) 
    (elixir) lib/code.ex:363: Code.require_file/2 
    (mix) lib/mix/tasks/run.ex:68: Mix.Tasks.Run.run/1 
    (mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2 
    (elixir) lib/code.ex:363: Code.require_file/2 

は、誰かが間違ってここに何が起こっているか私に説明していただけますか?

答えて

1

あなたは解除条項を追加する必要があります。

def multiply_seeder(x,n) when x <= n do 
... 
end 
def multiply_seeder(x,n), do: nil 

あなたの関数は、現在終了することはありません。 nは25なので、xが26に達するとFunctionClauseErrorとなります。

編集

機能は、自分の名前(multiply_seeder)そのアリティ(2)とは、彼らのガード節で構成されています。関数を呼び出したときに一致するものがなければ、FunctionClauseErrorが返されます。

関数を再帰的に呼び出す場合は、最初に終了節を記述するのが良い方法です。したがって、この場合、x>nの場合、再帰を停止する必要があります。だから、書くことができます:この場合

def multiply_seeder(x, n) when x > n, do: nil 

を、再帰が停止しますときx>n。あなたは今(もポケモン句として知られている)すべてのキャッチであなたの関数の本体を置くことができます。

def multiply_seeder(x, n) when x > n, do: nil 
def multiply_seeder(x,n) when x <=n do 
    recipe_seed 
    place_seed 
    review_seed 
    x = x+1 
    multiply_seeder(x,n) 
end 

注意順序が重要であること - 試合は上から下に評価されます。

この場合、再帰関数を手動で実装する必要はありません。

あなたのような何かを行うことができます。

Enum.each(1..25, fn _ -> 
    recipe_seed 
    place_seed 
    review_seed 
end) 
+0

はい...それは... 26のために行くんが...と終了しません。しかし、私はあなたの答えを取得していない..任意のドキュメントの参照??私はまだエラーが発生している..私はそれを間違ってやっている。あなたはどんな参考文献も提供することができますか? –

+0

エリクシルを手に入れようhttp://elixir-lang.org/getting-started/recursion.html – Gazler

+0

@ code.prio私のアップデートを見てください。より明確に。 – Gazler

関連する問題