2016-09-01 2 views
2

Попытка скопировать Trello пример, не может сделать работу с ревизии ForeignKeys:Elixir Ecto - неизвестное поле

миграции:

defmodule Final.Repo.Migrations.CreateKw do 
    use Ecto.Migration 

    def change do 
    create table(:kw) do 
     add :keyo_id, references(:keyo), null: false 
     add :users_id, references(:users), null: false 


     timestamps 
    end 
    create index(:kw, [:keyo_id]) 
    create index(:kw, [:users_id]) 
    create unique_index(:kw, [:keyo_id, :users_id]) 
    end 
end 

Модель:

defmodule Final.Kw do 
    use Final.Web, :model 

    alias Final.Repo 


    schema "kw" do 
    belongs_to :keyo, Final.Keyo 
    belongs_to :user, Final.User 

    timestamps 
    end 

    @required_fields ~w(keyo_id users_id) 
    @optional_fields ~w()  

    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 

end 

Полная ошибка:

** (ArgumentError) unknown field users_id (note only fields, embeds, belongs_to, has_one and has_many associations are supported in changesets)

Команда заставляя его:

changeset = Final.Kw.changeset(%Final.Kw{}, %{keyo_id: 1, users_id: 2}) 

Мой код почти такой же, как на примере, я перепробовал все возможные комбинации, но не может заставить его работать, что мне не хватает?

+0

Я столкнулся с подобной ошибкой, но в моем случае проблема заключалась в передаче строки вместо символа 'validate_required'. –

ответ

2

Проблема заключается в том, что внешний ключ, автоматически определяемый Ecto по умолчанию, представляет собой имя модели + «_id», которое в этом случае равно user_id, а ключ, который вы используете везде, - users_id. Вы можете переопределить путем изменения:

belongs_to :user, Final.User 

к:

belongs_to :user, Final.User, foreign_key: :users_id 

(Или, если возможно, вы можете изменить :users_id к :user_id везде, так как она считается более идиоматических.)

Смежные вопросы