2016-10-26 2 views
3

Я создал схему, которая выглядит следующим образом:Список карт в качестве аргумента

schema "countries" do 

    field :code, :string 
    field :en, :string 
    field :de, :string 
    field :it, :string 
    field :fr, :string 

    timestamps 

    end 

Теперь я хочу создать функцию, которая будет набор изменений принять список карты. Как я могу это определить? Правильно ли это (я бы сказал, что это неправильно):

Защиту changeset_all (модель, []) сделать

Тогда как я могу проверить, если передаваемый параметр содержит карты или нет?

Второй вопрос: как я могу перебирать список карт, после того, как я получу набор изменений всех значений пропусков? Я бы сделал следующее:

def changeset_all(model, [params]) do 

    for param <- [params] do 
     model 
     |> cast(param, [:code, :en, :de, :it, :fr]) 
     |> validate_required([:code, :en]) 
     |> validate_length(:code, max: 3) 
     |> unique_constraint(:code) 
    end 
    end 

Надеюсь, мои вопросы ясны.

ответ

3

def changeset_all(model, [params]) do принимает только список из 1 элемента. Для того, чтобы принимать какие-либо списки, вы можете сделать:

def changeset_all(model, params) when is_list(params) do 

Чтобы создать список ревизий, просто сделать for param <- params. Окончательный код должен выглядеть следующим образом:

def changeset_all(model, params) when is_list(params) do 
    for param <- params do 
    model 
    |> cast(param, [:code, :en, :de, :it, :fr]) 
    |> validate_required([:code, :en]) 
    |> validate_length(:code, max: 3) 
    |> unique_constraint(:code) 
    end 
end 

Тогда как я могу проверить, если передаваемый параметр содержит карты или нет?

Вам действительно не нужно это делать, как если бы вы передали недопустимый параметр, cast будет обрабатывать ошибку. Если вы хотите сделать это, вы можете перебрать список и использовать if, чтобы проверить, если это карта:

for param <- params 
    if !is_map(param) do 
    raise "#{param} is not a map" 
    end 
end 

for param <- params do 
    # changeset stuff 
end 

Я бы рекомендовал создать changeset/2 функцию отдельно и затем вызвать его с помощью Enum.map в changeset_all/2:

def changeset(model, params) do 
    model 
    |> cast(params, [:code, :en, :de, :it, :fr]) 
    |> validate_required([:code, :en]) 
    |> validate_length(:code, max: 3) 
    |> unique_constraint(:code) 
end 

def changeset_all(model, list) do 
    list |> Enum.map(fn params -> changeset(model, params) end) 
end 
+0

Большое спасибо, я попробую его сегодня вечером и дам вам знать. –